1. 일련의 사건
이 문제의 원인은 매우 간단합니다. 다른 요소 내에 요소가 중첩되어 있다고 가정합니다.
예상대로 Netscape와 Microsoft는 "브라우저 전쟁" 시대에 대처하기 위해 매우 다른 두 가지 접근 방식을 사용했습니다.
Netscape에서는 이러한 이벤트 발생 순서를 캡처 유형이라고 합니다.Microsoft에서는 이러한 이벤트 순서를 버블링 유형이라고 합니다. 그 중 사건의 순서는 정반대입니다. Explorer 브라우저는 버블링 이벤트만 지원하며 Mozilla, Opera7 및 Konqueror는 둘 다 지원합니다. 이전 Opera와 iCab은
을 지원하지 않습니다.
3. 이벤트 캡처
캡처 이벤트 사용 시
코드 복사
코드 복사
코드 복사
코드는 다음과 같습니다.
사용자가 요소 2를 클릭하면 다음은 어떻게 되나요?
1. 클릭 이벤트는 먼저 캡처 단계에 들어갑니다(점차적으로 요소 2의 방향으로 접근). 캡처 단계에서 요소 2의 조상 요소에 onclick 핸들러가 있는지 확인합니다
2. 요소 1에 onclick 핸들러가 있는 것으로 확인되었으므로 doSomething2가 실행됩니다
3. 이벤트는 대상 자체(요소 2)를 확인합니다. ), 그러나 캡처 단계에는 onclick 핸들러가 없습니다. 더 많은 처리 기능을 발견했습니다. 이벤트가 버블링 단계에 진입하기 시작하며 요소 2의 버블링 단계에 바인딩된 함수인 doSomething()이 자연스럽게 실행됩니다.4. 이벤트는 버블링 단계 동안 상위 요소에 바인딩된 핸들러가 있는지 확인하기 위해 요소 2에서 멀어집니다. 그런 경우가 없어서 아무 일도 일어나지 않습니다
반대의 경우는
6. 호환성 및 기존 모드
코드 복사
8. 늘 일어나는 일입니다
가장 먼저 이해해야 할 것은 이벤트 캡처 또는 버블링이 항상 발생한다는 것입니다. 전체 페이지 문서에 대한 일반적인 onclick 처리 기능을 정의하면
코드를 복사하세요
페이지의 요소를 클릭하는 클릭 이벤트는 결국 페이지의 가장 높은 문서 레이어까지 버블링되어 이전 처리 기능이 버블링이 종료되었음을 명시적으로 지적하지 않는 한 일반 처리 기능을 트리거합니다. 전체 문서 수준으로 전파
위 코드의 두 번째 문장에 추가:
>>> 먼저 IE에 대해 이야기해보겠습니다
object.setCapture() 객체가 setCapture일 때 해당 메소드는 캡처를 위해 전체 문서에 상속됩니다.
문서 전체를 캡처하기 위해 메소드를 상속받을 필요가 없을 때는 object.releaseCapture()를 사용하세요
>>>기타
Mozilla도 비슷한 기능이 있지만 메소드가 약간 다릅니다
window.captureEvents(Event.eventType)
window.releaseEvents(Event.eventType)
>>>예
9. 사용법
모든 이벤트 전파는 페이지 문서(이 최상위 수준)에서 종료되므로 다음과 같은 페이지가 있다고 가정하면 기본 이벤트 핸들러가 가능해집니다.브라우저학의 첫 번째 법칙을 기억하세요. 어떤 일이든 일어날 수 있으며, 이때 최소한 어느 정도 준비가 되어 있어야 합니다. 따라서 사용자가 드래그 앤 드래그를 할 때 페이지에서 마우스를 크게 움직이지만 스크립트가 큰 진폭에 응답하지 못하여 마우스가 더 이상 요소 레이어에 머물지 않는 경우가 발생할 수 있습니다.
1. onmouseover 핸들러 함수가 요소 레이어에 바인딩된 경우 이 요소 레이어는 더 이상 마우스 움직임에 반응하지 않으므로 사용자가 이상하게 느낄 수 있습니다.
2. onmouseup 핸들러 함수가 요소 레이어에 바인딩된 경우 , 이벤트가 트리거될 수 없습니다. 결과적으로 사용자가 이 요소 레이어를 드롭하려고 하면 요소 레이어가 계속해서 마우스 움직임에 반응합니다. 이로 인해 더 많은 혼란(?)이 발생하게 됩니다이 예에서는 이벤트 버블링이 매우 유용합니다. 핸들러 함수를 페이지 수준에 배치하면 해당 함수가 항상 실행될 수 있기 때문입니다.
그러나 일반적으로 기능이 서로 방해하지 않도록 버블링과 캡처를 모두 끄는 것이 좋습니다. 또한 문서 구조가 매우 복잡한 경우(많은 테이블이 서로 중첩되어 있는 경우 등) 시스템 리소스를 절약하기 위해 버블링을 해제할 수 있습니다. 이 시점에서 브라우저는 대상 요소의 모든 조상을 검사하여 핸들러 기능이 있는지 확인해야 합니다. 아무도 못찾아도 지금 검색하는데 시간이 많이 걸리네요 Microsoft 모델에서는 이벤트의 cancelBubble 속성을 true로 설정해야 합니다
코드 복사
{
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
}
cancelBubble 속성을 지원하는 브라우저에서 cancelBubble을 설정해도 아무런 해가 없습니다. 브라우저는 어깨를 으쓱하고 이 속성을 생성합니다. 물론 이것이 실제로 버블링을 취소하지는 않지만 최소한 이 명령이 안전하고 올바른지 보장합니다
11.현재대상
이전에 본 것처럼 이벤트는 target 또는 srcElement 속성을 사용하여 이벤트가 발생한 대상 요소(즉, 사용자가 처음 클릭한 요소)를 나타냅니다. 우리의 경우에는 요소 2를 클릭했기 때문에 요소 2입니다.
캡처 또는 버블링 단계 중 대상 요소는 변경되지 않고 항상 요소 2와 연결되어 있다는 점을 이해하는 것이 매우 중요합니다.
그러나 다음 함수를 바인딩한다고 가정해 보겠습니다.
element2.onclick = doSomething;
12. Microsoft 모델 문제
그러나 Microsoft 이벤트 바인딩 모델을 사용하는 경우 this 키워드는 HTML 요소와 동일하지 않습니다. Lenovo에는 currentTarget 속성(?)과 유사한 Microsoft 모델이 없습니다. 위 코드를 따른다면 다음을 의미합니다:
element2.attachEvent('onclick',doSomething)
곧 currentTarget과 유사한 속성을 추가할 수 있기를 바랍니다. 아니면 표준을 따르겠습니까? 웹 개발자에게는 이 정보가 필요합니다
후기:
실제로 자바스크립트를 사용해 본 적이 없기 때문에 이 글에서 잘 이해가 안 되는 부분이 있어서 드래그 효과에 대한 부분 등 뜬금없이 번역할 수 밖에 없습니다. 질문이 있으면 나에게 메시지를 남겨주세요. 지원해 주셔서 감사합니다!