이벤트 버블 링은 일반적으로 어떻게 작동하며 이벤트 전파와 동의어입니까?


11

나는 이벤트 중심 (서브) 시스템에서 이벤트 디스패치의 일반적인 작업과 원칙에 대해 머리를 감싸려고합니다.

Javascript, Flash (Actionscript 2 및 3)와 같은 경우에 꽤 많이 사용했지만 한 번에 PHP로 간단한 이벤트 발송 시스템을 만들었지 만 이벤트 버블 링 및 / 또는 실제로 이해하지 못했습니다. 잘 전파.

첫 번째 질문 :
이벤트가 이벤트 전파와 동의어입니까?

두 번째 질문 :
이벤트가 "버블 링"할 때 이것이 객체의 계층 구조로 "이동"한다는 것을 이해하는 것이 맞습니까?

세번째로 가장 중요한 질문 :
질문 2에 대한 나의 이해가 정확하다면; 이것이 객체의 계층 구조를 어떻게 일반적으로 구현 하는가?
그것은 일반적으로 부모 개체 "재발송"에 동일한 이벤트 있다는 뜻 의 부모 (때까지 루트 개체에 도달)? 그리고 만약 그렇다면; 계층 구조의 모든 객체가 이러한 이벤트에 대해 자녀의 말을 들어야합니까? 아니면 이벤트 버블 링에 대한 이해에서 부모 객체가 자식 객체 이벤트의 리스너로 자신을 등록 할 필요가없는 중요한 원칙이 누락 되었습니까?

간단한 의사 코드를 사용하여 이러한 기본 원칙을 설명 할 수 있다면 감사 할 것입니다.


1
관련 기사 : 이벤트 순서
— Jonas

답변:


7

첫 번째 질문 : 이벤트가 이벤트 전파와 동의어입니까?

버블 링은 이벤트 전파의 한 형태이지만 동의어로 사용할 수 없습니다. 전파는 이벤트를 전달하는 일반적인 용어입니다. 버블 링은 이벤트 전파의 특정 전략입니다.

두 번째 질문 : 이벤트가 "거품"일 때 이것이 개체의 계층 구조로 "이동"한다는 것을 이해하는 것이 맞습니까?

예. 버블 링 은 tunneling 과 달리 계층 구조를 올라가는 것을 의미합니다. 즉, 최상위 요소에서 아래로 내려가거나 라우팅 됩니다. 즉, 이벤트를 수신 할 다음 객체가 무엇이든 될 수 있습니다.

세번째로 가장 중요한 질문 : 질문 2에 대한 나의 이해가 정확하다면; 이것이 객체의 계층 구조를 어떻게 일반적으로 구현 하는가?

아주 쉽습니다. 시각적 계층 구조에서 컨트롤은 부모 / 그들의 최상위 비주얼에 대한 참조를 갖거나 어딘가에서 얻을 수 있습니다. 따라서 이벤트를 캡처하면 부모에게 이벤트에 대해 알리기 만하면 부모에게 이벤트 등을 알립니다.

의사 코드는 모든 UI 컨트롤에서 다음과 같습니다.

OnEvent(SomeEvent event)
{
   CallHandlersForEvent(event);
   if(HasParent && event.ContinueBubbling == true)
   {
       Parent.OnEvent(event);
   }
}

블루 베리 필드 (Blueberryfields)와 마찬가지로 다음 행사를받는 직접적인 부모 일 필요는 없다. 다음과 같이 구현할 수도 있습니다.

OnEvent(SomeEvent event)
{
    CallHandlersForEvent(event);
    NextControl = VisualTree.GetVisualParent(this);
    if(NextControl != null && event.ContinueBubbling == true)
    {
       NextControl.OnEvent(event);
    }
}

+1 의사 코드가 제게 의미가 있습니다. 감사합니다! (그렇게 당신의 나머지 답변은
— 그렇습니다

@fireeyedboy : 천만에요 =)
— 팔콘

1

첫 번째 답변 :

이벤트 버블 링은 이벤트 전파를 안내하는 특정 알고리즘입니다.

두 번째 답변 :

아니요, 버블 링은 계층 구조와 반드시 관련 될 필요는 없습니다. 내부 또는 다른 곳에서 객체가 표현되는 방식은 알고리즘이 제대로 작동하는 데 중요하지 않습니다. 이상적으로 이벤트가 거품이 발생하면 화면의 가장 안쪽에 보이는 요소에서 화면의 가장 바깥쪽에있는 요소까지 바깥쪽으로 확장됩니다.

세 번째 답변 :

구현 세부 사항은 각 내부 (브라우저)의 내부 구현 방식에 따라 크게 달라질 수 있습니다. bubbling알고리즘은 화면의 영상에 따라 달라집니다. 캡슐화 요소가 내부 요소보다 상속 계층 구조에서 높으면 예를 들어 언어의 표준 상속 메커니즘을 사용하여 버블 링을 구현할 수 있습니다. 그러나 반드시 사실은 아닙니다. 내부 구조와 화면의 가시성을 모두 해석하고 내부 조직을 무시하면서 알고리즘에 따라 이벤트를 전파 할 수있는 특수 메커니즘이있을 수 있습니다.


1
왜 "버블 링은 어떤 계층 구조와도 관련이있는 것은 아닙니다". 제 생각에는 그렇습니다. 계층 구조가 없으면 버블 링이 없습니다. 어떤 종류의 나무가 있어야합니다. 트리 구조없이 버블 링의 예를들 수 있습니까? "가장 안쪽에서 가장 바깥쪽으로 보이는 요소"의 예는 시각적 계층입니다.
— 팔콘

1
당신이 경우 물론, 당신은 계층 구조로 해석 할 수있는 정말 원하는. 나는 시각적으로 비 시각적 요소를 포함하는 느슨하게 결합 된 그래프로 생각합니다.
— blueberryfields

2
그러나 버블 링 비유는 실패합니다. 그래프에서 버블 링이 아래에서 위로 명확하게 진행되는 동안 이벤트가 어디에서나 라우팅 될 수 있기 때문입니다.
— 팔콘

더 이상 임의의 그래프에서 버블 링이라고 부를 수 없다고 생각합니다. "이벤트 라우팅"이라고하고 imho라고해야합니다.
— 팔콘

1
나는 팔콘이 몇 가지 공정한 포인트를 믿습니다. 버블 링을 위로 움직이는 무언가 (계층 구조)로 생각하는 것이 합리적입니다.
— 괜찮은 Dabbler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.