事件捕获和事件冒泡?阻止事件冒泡,默认事件的发生

事件捕获和事件冒泡

首先我们先了解什么是事件流
事件流描述了页面接收事件的顺序, 先捕获(由外到内),到事件源,在冒泡(由内到外)。
三个阶段:捕获,事件源,冒泡
![](https://img-blog.csdnimg.cn/5730323d6e7d4a4cadf8f813b42eb677.png

1.事件捕获(Netscape事件流)

事件捕获的意思是最不具体的节点应该最先收到事件,而最具体的节点应该最后收到事件。事件捕获实际上是为了在事件到达最终目标前拦截事件。(由外到内)
案例:

 <style>
      #div1 {
        width: 400px;
        height: 400px;
        border: 1px solid red;
        text-align: center;
      }
      #p1 {
        display: inline-block;
        width: 200px;
        height: 200px;
        border: 1px solid red;
        text-align: center;
      }
      #a1 {
        display: inline-block;
        width: 100px;
        height: 100px;
        border: 1px solid red;
      }
    </style>
    <script>
      window.onload = function () {
        var div = document.querySelectorAll("div,p,a");
        // console.log(div[0]);
        function divClick() {
          console.log(this.tagName + '被点击了');
        }
        for (var key of div) {
          key.addEventListener("click", divClick,true);//监听事件的第三个参数为true时是事件捕获,默认值为false(事件冒泡)
        }
       // div[0].removeEventListener("click", divClick, true);
      };
    </script>
  </head>
  <body>
    <div id="div1">
      我是div
      <p id="p1">
        我是p
        <a id="a1">我是a</a>
      </p>
    </div>
  </body>

效果图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/98fda8bec64546a394c482fecd34a95d.png

点击最里面的a标签时,由最外面的div开始往里寻找目标标签a,因为全部元素都被绑定了点击事件,所以由外到内一次触发。
在这里插入图片描述
由于旧版本浏览器不支持,因此实际当中几乎不会使用事件捕获。通常建议使用事件冒泡,特殊情况下可以使用事件捕获。

即使事件源没有绑定相关事件,也会发生事件捕获和冒泡。(例子:如果上述的a标签没有绑定点击事件,被点击的时候也会发生事件捕获)

2.事件冒泡(IE事件流)

IE 事件流被称为事件冒泡,这是因为事件被定义为从最具体的元素(文档树中最深的节点)开始触发,然后向上传播至没有那么具体的元素(文档)。(由内到外)
案例:

 <style>
      #div1 {
        width: 400px;
        height: 400px;
        border: 1px solid red;
        text-align: center;
      }
      #p1 {
        display: inline-block;
        width: 200px;
        height: 200px;
        border: 1px solid red;
        text-align: center;
      }
      #a1 {
        display: inline-block;
        width: 100px;
        height: 100px;
        border: 1px solid red;
      }
    </style>
    <script>
      window.onload = function () {
        var div = document.querySelectorAll("div,p,a");
        // console.log(div[1]);
        function divClick() {
          console.log(this.tagName + "被点击了");
        }
        for (var key of div) {
          key.addEventListener("click", divClick, false);//第三个参数为false,为事件冒泡
        }
        // div[0].removeEventListener("click", divClick, false);
      };
    </script>
  </head>
  <body>
    <div id="div1">
      我是div
      <p id="p1">
        我是p
        <a id="a1">我是a</a>
      </p>
    </div>
  </body>

效果图如上,就不放了。
点击最里面的a标签,最先触发 click 事件。然后,click 事件沿DOM 树一路向上,在经过的每个节点上依次触发,直至到达 document 对象,所以div,p触发点击事件。
在这里插入图片描述
事件冒泡可能会使绑定相同事件的父子元素一同触发,会达不到我们想要的效果,所以有时我们要阻止冒泡事件。

阻止冒泡事件

使用阻止事件冒泡之前,先要知道DOM事件默认提供的一个对象,HTML DOM Event对象。
Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。
事件通常与函数结合使用,函数不会在事件发生前被执行!

event.stopPropagation()

直接在对应方法中使用event.stopPropagation()便可阻止事件冒泡。

阻止默认事件发生

用于阻止特定事件的默认动作。比如,链接的默认行为就是在被单击时导航到 href 属性指定的 URL或是修改表单提交的默认事件。

event.preventDefault()

直接在对应方法中使用event.preventDefault()。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值