事件冒泡 vs 事件捕获

什么是事件冒泡

微软提出了名为事件冒泡的事件流,事件会从最内层的元素开始发生,一直向上传播,直到根节点
举例说一下吧:

<div id="one" style="height: 100px; width: 100px;background-color: red">
    <div id="two" style="height: 80px; width: 80px;background-color: orange">
        <button id="three">点我</button>
    </div>
</div>

我这里有两个div嵌套,最里面放一个button,那么我们给它们都加一个事件:

$("#one").click(function () {
        console.log("我是最外面的div");
 });
$("#two").click(function () {
        console.log("我是中间的div");
 });
 $("#three").click(function () {
       console.log("我是最里面的button");
 })

那么当我点击这个button按钮的时候,显示如下:


当我点击中间橙色部分的时候显示如下:

相信大家已经看出来了,我点击了最里面的button,我的事件执行顺序从button到中间的div直至最外面的div,当我点击中间div的时候,先执行中间的div再执行外面的div,这就是事件冒泡,事件按照DOM的层次结构像水泡一样不断向上直至顶端

什么是事件捕获

事件捕获刚好与事件冒泡相反,事件捕获是从最顶端往下开始触发,但是jQuery不支持事件捕获,所以得使用原生JavaScript,就使用刚才的例子:

    var one = document.getElementById("one");
    var two = document.getElementById("two");
    var three = document.getElementById("three");
    one.addEventListener("click",function(e){
        console.log("我是最外面的div");
    },true);          //如果是false,就是事件冒泡
    two.addEventListener("click",function(e){
        console.log("我是中间的div");
    },true);
    three.addEventListener("click",function(e){
        console.log("我是最里面的button");
    },true);

当我点击按钮的时候,我的事件执行顺序和刚才的事件冒泡就刚好相反,从外面的div到中间的div再到最里面的button

停止事件冒泡和事件捕获

停止事件冒泡和事件捕获可以阻止事件中其他对象的事件处理函数被执行,w3c 的方法是 e.stopPropagation(),IE 则是使用 e.cancelBubble = true,就上述例子进行说明,在点击事件里面加一句就可以了,比如说button的点击事件:

$("#three").click(function (event) {
       console.log("我是最里面的button");
       event.stopPropagation();    //  IE中可以使用event.cancelBubble = true
   })

我可以将e.stopPropagation()改为return false,同样可以阻止事件冒泡和捕获

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景知识 什么是事件?直观的说就是网页上发生的事情,大部分是指用户的鼠标动作和键盘动作,如点击、移动鼠标、按下某个...
    吧啦啦小汤圆阅读 5,885评论 2 15
  • 0.起因 前几天写业务的时候,碰到了这样的需求: checkbox在父DIV的里面,但是checkbox绑定了v-...
    CoderMageFox阅读 4,434评论 1 0
  • 这个问题也是老生常谈了,写这篇文章的主要目的是进行下梳理,了解自己知识点的掌握程度,也希望对大家有所帮助。 在说如...
    一木_qintb阅读 9,775评论 1 4
  • 总结: 鼠标事件 1.click与dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r阅读 5,540评论 2 10
  • 1、感恩自己,所学终有所思,所思终有所得,了解了自己的创伤,寻找到内在的小孩。谢谢!谢谢!谢谢! 2、感谢头脑,一...
    木子青青草阅读 1,135评论 0 0

友情链接更多精彩内容