欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-14 22:09:48
...

事件流

:描述的是从页面中接收事件的顺序。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中尚不存在的元素绑定事件;

相关标签: 事件传递机制