事件流
事件流描述的是从页面接受事件的顺序。但IE和Netscape开发团队提出了差不多是完全相反的事件流概念,IE是事件流是事件冒泡流,而Netscape的事件流是事件捕获流。
事件冒泡
事件冒泡(event bubbling)–即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(document)。
123456 <html><head></head><body><div id="clickedDiv">Click!</div></body></html>如果点击div元素,click事件的传播顺序:
-> -> -> document
事件捕获
事件捕获(event capturing)–即不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件。事件捕获的用意在于在事件到达预定目标之前捕获它。
->
如果点击div元素,click事件的传播顺序:document -> ->
DOM事件流
“DOM2级事件”规定事件流包括三个阶段:
- 事件捕获阶段 – 为截获事件提供机会
- 处于目标阶段 – 实际的目标接收到事件
- 事件冒泡阶段 – 在这个阶段对事件做出响应
在DOM事件流中,实际的目标(div)在捕获阶段不会接收到事件。意思就是在捕获阶段,事件从document到html再到body后就停止了。然后是“处于目标”阶段,事件在div上发生,并在事件处理中被看成冒泡阶段的一部分。然后,冒泡阶段发生,事件又传播回文档。
事件处理程序
事件处理程序–相应某个事件的函数。
html事件处理程序
123456789101112 <html><head><script>function showMessage() {alert('Hello!');}</script></head><body><div id="clickedDiv" onclick="showMessage()">Click!</div></body></html>这种方式不够灵活,HTML和JavaScript代码紧密耦合。
DOM0级事件处理程序
|
|
DOM2级事件处理程序
|
|
DOM2级添加事件处理程序的好处是可以添加多个事件处理程序。
注意:通过addEventListener添加的事件处理程序只能使用removeEventListener来移除,且移除时传入的参数与添加处理程序时使用的参数相同,也就是说addEventListener添加的匿名函数将无法移除。因此要这样儿:
1234567 var btn = document.getElementById('clickedDiv');var handler = function() {alert(this.id);}btn.addEventListener("click", handler, false);btn.removeEventListener("click", handler, false);//有效//第三个参数:true表示在捕获阶段调用事件处理程序,false表示在冒泡阶段调用事件处理程序。
IE级事件处理程序
|
|
事件对象
event对象的currentTaget、target、this
在事件处理程序内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标。如果直接将事件处理程序指定给目标元素,则三者包含相同的值。如果事件处理程序存在于按钮的父节点中(eg.document.body),那么这些值是不相同的。
event的preventDefault()、stopPropagation()、stopImmediatePropagation()方法
- preventDefault():取消事件的默认行为。如果cancelable属性=true,则可以使用该方法
- stopPropagation():取消事件的进一步捕获或冒泡,如果bubbles属性=true,则可以使用该方法
- stopImmediatePropagation():取消事件的进一步捕获或冒泡,同时阻止任何事件处理程序被调用(DOM3级事件新增)
###