JS 事件(1)——事件流
事件
JavaScript与HTML之间的交互方式是通过事件来实现的。
事件,就是文档或浏览器窗口发生的一些特定的交互瞬间。
可以用侦听器(或处理程序)来预订事件,以便在事件发生时执行相应的程序——观察员模式。
IE9、Firefox、Opera、Safari和Chrome全部已经实现了“DOM2级事件”的核心部分。
事件流
事件流,描述的是从页面中接收事件的顺序。
IE的事件冒泡流:事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到最不具体的元素。
Netscape Communicator的事件捕获流:不太具体的节点应该更早地接收到事件,而最具体的节点应该最后接收到事件。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>事件冒泡流demo</title> 6 </head> 7 <body> 8 <div id="box"> 9 <input type="button" id="btn" value="button"> 10 </div> 11 <script type="text/javascript"> 12 var event_util = { 13 //添加事件 14 addHandler: function(element, type, handler) { 15 if(element.addEventListener) { 16 element.addEventListener(type, handler, false); 17 } else if(element.attachEvent) { 18 element.attachEvent("on" + type, handler); 19 } else { 20 element["on" + type] = handler; 21 } 22 }, 23 //移除事件 24 removeHandler: function(element, type, handler) { 25 if(element.removeEventListener) { 26 element.removeEventListener(type, handler, false); 27 } else if(element.detachEvent) { 28 element.detachEvent("on" + type, handler); 29 } else { 30 element["on" + type] = null; 31 } 32 } 33 }; 34 35 //依次给btn-div-body-html-document指定事件处理程序 36 function showBtn() { 37 alert("You've clicked the button."); 38 }; 39 function showDiv() { 40 alert("You've clicked the div."); 41 }; 42 function showBody() { 43 alert("You've clicked the body."); 44 }; 45 function showHtml() { 46 alert("You've clicked the html."); 47 }; 48 function showDocument() { 49 alert("You've clicked the document."); 50 }; 51 52 //依次取得btn-div-body-html 53 var btn = document.getElementById("btn"); 54 var div = document.getElementById("box"); 55 var body = document.body; 56 var html = document.documentElement; 57 58 //依次给btn-div-body-html-document添加点击事件 59 event_util.addHandler(btn, "click", showBtn); 60 event_util.addHandler(div, "click", showDiv); 61 event_util.addHandler(body, "click", showBody); 62 event_util.addHandler(html, "click", showHtml); 63 event_util.addHandler(document, "click", showDocument); 64 </script> 65 </body> 66 </html>
如果单击了页面中的<input>元素,在冒泡流的情况下,事件会从input-div-body-html-document-(window)这样传播;而在捕获流的情况下,事件会以(window)-document-html-body-div-input这样的顺序传播。
所有现代浏览器都支持事件冒泡。
“DOM2级事件”规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。
在事件捕获阶段,事件的传播顺序为document-html-body-div(不会涉及input);在处于目标阶段,事件在<input>元素上发生;在事件冒泡阶段,事件冒泡,逐级向上传播。
注意:
在浏览器实现方面,IE9、Safari、Chrome、Firefox和Opera都支持事件流。
即使“OOM2级事件”规范明确要求在事件捕获阶段不会涉及事件目标,但在IE9、Safari、Chrome、Firefox和Opera9.5及更高版本都会在事件捕获阶段触发事件对象上的事件;也就是说,有两个机会在目标对象上操作事件。

浙公网安备 33010602011771号