事件冒泡、事件捕获与事件委托

来源:互联网 发布:c语言.h文件 编辑:程序博客网 时间:2024/04/29 16:40

事件流

:描述的是从页面中接收事件的顺序。IE和Netscape开发团队居然提出了差不多是相反的事件流的概念。
IE的事件流是事件冒泡流
Netscape的事件流是事件捕获流。

事件冒泡

事件冒泡(event bubbling),即事件开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。
举个例子:




事件冒泡


Click Me

如果单击页面中的button元素,那么这个click事件会按照如下顺序传播
(1)
(2)
(3)
(4)document
也就是说,click事件首先在元素上发生,而这个元素就是我们单击的元素。然后,click事件沿着DOM树向上传播,在每一级节点上都会发生,直至传播到document对象。
事件冒泡过程:

事件捕获(event capturing)

事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件。
事件捕获的用意在于事件到达预订目标之前捕获它。
同样以上例子为例
单击元素就会以下列顺序触发click事件
document



在事件捕获过程中,docu对象首先接收到click事件,然后事件沿着DOM树依次向下,一直传播到事件的实际目标,即元素,如下图:

DOM事件流
规定事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。
首先事件捕获:为截获事件提供机会,然后是实际的目标接收到事件,最后一个阶段是冒泡阶段,可以在这个阶段对事件作出响应。

事件的传播是可以阻止的:
• 在W3c中,使用stopPropagation()方法
• 在IE下设置cancelBubble = true;
在捕获的过程中stopPropagation();后,后面的冒泡过程也不会发生了~
3.阻止事件的默认行为,例如click 后的跳转~
• 在W3c中,使用preventDefault()方法;
• 在IE下设置window.event.returnValue = false
借鉴的
这篇文章讲的挺好,不再赘述。举个例子,取消事件冒泡的

<!DOCTYPE html><html><head lang="en">    <meta charset="UTF-8">    <title></title></head><body><button id="btn">点击</button></body></html><script>    var btn = document.getElementById("btn");    document.onclick = function() {        alert("点击了空白处");    }    btn.onclick = function(event) {        alert("点击了按钮");        var event = event || window.event;        if(event && event.stopPropagation)        {            event.stopPropagation();  //  w3c 标准        }        else        {            event.cancelBubble = true;  // ie 678  ie浏览器        }    }</script>

事件委托

事件委托利用了事件冒泡,之指定一个事件处理程序,就可以管理某一类型的所有事件。
例如,click事件会一直冒泡到document层次,也就是说,我们可以为整个页面指定一个onclick事件处理程序,而不必给每个可单击的元素分别添加事件处理程序。

什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。
  举个列子:有三个同事预计会在周一收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台MM代为签收。现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递)。前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款。这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收。
原理:
  利用冒泡的原理,把事件加到父级上,触发执行效果。
作用:
1.性能要好
2.针对新创建的元素,直接可以拥有事件
事件源 :
  跟this作用一样(他不用看指向问题,谁操作的就是谁),event对象下的
使用情景:
  •为DOM中的很多元素绑定相同事件;
  •为DOM中尚不存在的元素绑定事件;