事件冒泡和事件捕获区别及设置

事件冒泡:从下至上(是指子元素向父元素传递的过程),  bool=false冒泡(默认)

事件捕获:从上至下(是指父元素向子元素传递的过程), bool=true 捕获 一般不会用到

事件委托:利用冒泡的原理,把事件加到父级上,触发执行效果。

     优点:1. 使用事件代理的方法少了遍历所有li节点的操作,性能上更加优化;
                2. 针对新创建的元素,直接可以拥有事件,不用再重新绑定。
     使用情景:
          •为DOM中的很多元素绑定相同事件;
          •为DOM中尚不存在的元素绑定事件;

例子:假设一个元素div,它有一个下级元素p。
<div>
  <p id="button">元素</p>
</div>
这两个元素都绑定了click事件,如果用户点击了p,它在div和p上都触发了click事件,那这两个事件处理程序哪个先执行呢?事件顺序是什么?

当你使用事件捕获时,父级元素先触发,子级元素后触发,即div先触发,p后触发。

document.getElementById("button").addEventListener("click",function(){
    alert("button");
},false);

当你使用事件冒泡时,子级元素先触发,父级元素后触发,即p先触发,div后触发。

document.getElementById("button").addEventListener("click",function(){
    alert("button");
},true);

 

addEventListener方法
element.addEventListener(event, function, useCapture)

第一个参数是需要绑定的事件,第二个参数是触发事件后要执行的函数。

第三个参数是布尔值:

注意:addEventListener() 必须用 removeEventListener() 解除

在W3c中,使用 stopPropagation() 方法来阻止冒泡

document.getElementById("button").addEventListener("click",function(event){
    alert("button");
    event.stopPropagation();    
},false);

使用DOM3级新增事件 stopImmediatePropagation() 方法来阻止事件捕获,另外此方法还可以阻止事件冒泡。

document.getElementById("second").addEventListener("click",function(){
    alert("second");
    event.stopImmediatePropagation();
},true);  

 

stopImmediatePropagation() 和 stopPropagation()的区别

后者只会阻止冒泡或者是捕获。 但是前者除此之外还会阻止该元素的其他事件发生,但是后者就不会阻止其他事件的发生。

 

<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <ul>
    <li>hello 1</li>
    <li>hello 2</li>
    <li>hello 3</li>
    <li>hello 4</li>
  </ul>
  <script>
    var ul = document.getElementsByTagName("ul")[0];
    ul.addEventListener('click',function(e){
      console.log('e.target', e.target)   //被点击的li
      console.log('e.currentTarget', e.currentTarget)   //ul
      // e.target 指向触发事件监听的对象。
      // e.currentTarget 指向添加监听事件的对象。
      console.log('e.target.nodeName', e.target.nodeName)
      if (e.target && e.target.nodeName == "LI") {
        console.log("li被点击了");
      }
    })
  </script>
</body>
</html>

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值