事件机制(问题解答)

问题列表

  • 是不是所有事件都会有冒泡阶段?
  • 捕获阶段有什么用?
  • 在有些情况下我们并不希望捕获和冒泡阶段中当前事件的进一步传播,那么如何阻止捕获和冒泡?
  • 如何注销一个事件?
  • 比如像a标签,当你点击后会有一个默认行为,那么我们怎么取消默认事件?
第一个问题:是不是所有事件都会有冒泡阶段?

答:并不是所有事件都会有冒泡阶段,请参考https://developer.mozilla.org/zh-CN/docs/Web/Events关于事件的说明。

第二个问题:捕获阶段有什么用?

答:捕获阶段的主要任务是建立传播路经,在冒泡阶段根据这个路经回溯到文档根节点。

第三个问题:如何阻止捕获和冒泡?

答:w3c的方法是stopPropagation() IE下是用的cancelBubble = true来阻止。

例子

html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>阻止事件捕获与冒泡</title>
</head>
<body>
<div class="div">
  <li class="li">
    <a href="#" class="a">click</a>
  </li>
</div>
<script type="text/javascript" src="index.js"></script>
</body>
</html>

javascript

window.onload = () =>{
    //取消冒泡与捕获函数
    function stopBubble(e){
      let evt = e||window.event;
      //w3c的方法是stopPropagation() IE下是用的cancelBubble = true
      evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble = true);//阻止冒泡
      evt.preventDefault()//阻止默认事件

    }
    let a = document.querySelector('.a');
    let li = document.querySelector('.li');
    let div = document.querySelector('.div');
    a.addEventListener('click',(e)=>{
      console.log('a');
      stopBubble(e);
    })
    li.addEventListener('click',(e)=>{
      console.log('li');
    })
    div.addEventListener('click',(e)=>{
      console.log('div');
    })
  }

控制台
在这里插入图片描述
我们可以看到此时当我们点击a标签时,阻止了它的捕获和冒泡,如果你也想阻止li标签的,那么你也应该调用stopBubble(e)函数。

第四个问题:如何注销一个事件?

答:使用removeEventListener()具体大家可以参考https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/removeEventListener

第五个问题:我们怎么取消默认事件?

答:取消默认事件只需要调用一下preventDefault()函数就可以了。


最后我们可以提取出一个函数既可以阻止捕获和冒泡也可以取消默认事件。

    //取消冒泡与捕获函数
    function stopBubble(e){
      let evt = e||window.event;
      //w3c的方法是stopPropagation() IE下是用的cancelBubble = true
      evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble = true);//阻止冒泡
      evt.preventDefault()//阻止默认事件
    }

好了,上一次的问题就解答完了,如有不对,还望指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值