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


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.