이벤트
사용자와 웹페이지 간의 상호작용은 이벤트를 통해 실현됩니다. 이벤트는 처음에는 서버 부하를 공유하는 수단으로 사용되었습니다. 처음에는 Netscape와 IE가 통일된 사양이 없었습니다. 자체 API 사양이 있습니다.
이벤트 트리거 메커니즘과 관련하여 두 회사는 페이지의 트리거 메커니즘이 특정 요소를 클릭할 때 현재 대상 요소의 이벤트를 트리거하는 것만이 아니라고 믿습니다.
예: 페이지에 여러 개의 동심원이 있습니다. 가장 안쪽 원을 클릭하면 실제로는 이 원의 외부를 포함하는 원을 클릭하게 됩니다. 두 회사는 이 점에 동의하지만 이벤트 스트림의 전파 순서는 이벤트 버블링과 이벤트 캡처라는 두 가지 솔루션을 사용하여 구현됩니다.
IE 브라우저는 이전 버전부터 항상 이벤트 버블링 메커니즘을 지원해 왔습니다. 소위 이벤트 버블링은 이벤트 흐름이 보다 구체적인 것에서 시작된다는 것을 의미합니다. 요소는 지정되지 않은 요소로 수신되고 전파됩니다.
은 대상 요소에서 상위 요소로 전파됩니다.
<div> <div></div> </div> <script> function childEventHandler(event) { console.log(this); console.log("child 被点击了"); } function parentEventHandler(event) { console.log(this); console.log("parent 被点击了"); } function bodyEventHandler(event) { console.log(this); console.log("body 被点击了"); } function htmlEventHandler(event) { console.log(this); console.log("html 被点击了"); } function documentEventHandler(event) { console.log(this); console.log("document 被点击了"); } function windowEventHandler(event) { console.log(this); console.log("window 被点击了"); } var bodyEl = document.getElementsByTagName("body")[0]; var htmlEl = document.getElementsByTagName("html")[0]; var win = window; var parentEl = document.getElementById("parent"); var childEl = document.getElementById("child"); childEl.onclick = childEventHandler; parentEl.onclick = parentEventHandler; bodyEl.onclick = bodyEventHandler; htmlEl.onclick = htmlEventHandler; document.onclick = documentEventHandler; win.onclick = windowEventHandler; </script>
아래 그림과 같이 id가 child인 요소를 클릭하면 이벤트 흐름이 child에서 window 객체로 전파됩니다.
# 🎜 🎜#모든 최신 브라우저는 이벤트 버블링을 지원합니다. 2. 이벤트 캡처Netscape가 주도하는 이벤트 캡처는 이벤트 버블링의 반대입니다. 이벤트 스트림은 불특정 요소에서 시작되어 특정 요소로 전파됩니다. 요소에. 즉, 상위 요소에서 대상 요소로 전파됩니다.
이벤트 캡처는 IE 9부터 지원되고, 구형 브라우저와 호환되지 않기 때문에 이를 사용하는 사람들이 더 많아졌습니다. 약간의. 3. 이벤트 흐름 DOM에서는 이벤트에 이벤트 캡처, 대상 단계, 이벤트 버블링의 세 단계가 포함된다고 규정합니다. IE 9부터 시작하는 브라우저에서는 이벤트 흐름의 순서가 먼저 이벤트 캡처이고, 이벤트가 가로채고, 그 다음 대상 단계에 있고, 실제 대상이 이벤트를 받고, 마지막으로 이벤트가 발생한다고 규정합니다. 이 단계에서 이벤트에 응답합니다. 이전 하위 요소를 예로 들면, 하위 요소가 이벤트를 수신하기 전까지(창에서 상위로) 이벤트 캡처 단계입니다. 자식 요소에 도달하면 이때 이벤트가 처리되며, 버블링 단계에서도 이벤트가 처리될 수 있습니다. 이벤트를 처리할 수 있는 이벤트 버블링의 특성을 바탕으로 이와 관련된 이벤트 위임 메커니즘에 대해서는 뒤에서 다루도록 하겠다.
4. 이벤트 바인딩 HTML과 이벤트 사이에는 세 가지 형태의 바인딩이 있습니다. :
1. <div></div> 2. var childEl = document.getElementById("child"); childEl.onclick = function() { console.log('hello'); } 3. var childEl = document.getElementById("child"); childEl.addEventListener('click', function() { console.log('hello'); }, false);
第一种写法: childEl.onclick = null; 第三种写法: function eventHandler() { console.log('hello'); } childEl.addEventListener('click', eventHandler, false); childEl.removeEventListener('click', eventHandler, false);
我们通过事件委托的思路来想,事件流的传播,目标元素本身依然会有事件,但同时,冒泡出去后,更高层次的 dom 也能处理事件程序。那么,我们只需要给高层次节点绑定事件,通过判断具体是触发的哪个子节点,再做相应的事件处理。
menu 列表的每个子菜单元素的事件都能正确响应,新增的 menu-new 同样也能正确响应事件。
事件委托的好处在于,我们不用给每个元素都一一地手动添加绑定事件,避免重复低效的工作。
其次,事件委托更少得获取 dom, 初始化元素对象和事件函数,能有效减少内存占用。
每当将事件程序指定给元素时,html 代码和 js 代码之间就建立了一个连接,这种连接越多,网页就执行起来越慢,所以事件委托能有效减少连接树,提高网页性能。
用户与网页的交互是通过事件进行的,事件模型分为事件冒泡和事件捕获,事件冒泡的兼容性更好,应用更广,同时通过事件冒泡,可以建立事件委托,提升网页性能。
위 내용은 JavaScript의 이벤트 모델에 대한 자세한 설명(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!