js事件机制:冒泡与捕获

基础知识

1.操作系统最先知道用户点击了鼠标,浏览器次之
2.child 被点击了,意味着 parent 也被点击了
3.如果我同时监听了 child 和 parent,那么谁先通知我?这是个问题。

捕获阶段

parent 先通知,child 后通知

<body>
  <div class="parent">
    <div class="child"></div>
  </div>
<script>
  var parent = document.getElementsByClassName("parent")[0];
  var child = document.getElementsByClassName("child")[0];
  child.addEventListener('click',function(){
    console.log("child")
  },true)
  parent.addEventListener('click',function(){
    console.log("parent");
  },true)
  document.body.addEventListener('click',function(){
    console.log("body");
  },true)
</script>
</body>

当点击chlid时,控制台依次显示如下:

捕获从window开始,到document,再到html,再到body,再到被点击元素的祖先元素,再到被点击元素的父元素,最后到被点击的元素。一级一级往下找,只要有监听事件,就执行。用一幅图描述,如下:

Capture Phase就是捕获阶段,只有早期 Navigator 默认支持它,所以我们一般不用「捕获阶段」。Bubbling Phase是冒泡阶段,一般用「冒泡阶段」。

冒泡阶段

child 先通知,parent 后通知
IE 一开始就支持冒泡。

<body>
  <div class="parent">
    <div class="child"></div>
  </div>
<script>
  var parent = document.getElementsByClassName("parent")[0];
  var child = document.getElementsByClassName("child")[0];
  child.addEventListener('click',function(){
    console.log("child")
  })
  parent.addEventListener('click',function(){
    console.log("parent");
  })
  document.body.addEventListener('click',function(){
    console.log("body");
  })
</script>
</body>

当点击chlid时,控制台显示如下:

冒泡跟捕获相反,从被点击的元素开始,到被点击元素的父元素,再到被点击元素的祖先元素,再到body,再到html,再到document,最后到window,一级一级往上冒,有监听事件就执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 学这个的时候,这东西把我搞得很头晕。于是决定写一篇Blog出来把这玩意说清楚,让和我一样在这个坑里打滚的人不那么晕...
    CoderMageFox阅读 636评论 0 3
  • 背景知识 什么是事件?直观的说就是网页上发生的事情,大部分是指用户的鼠标动作和键盘动作,如点击、移动鼠标、按下某个...
    吧啦啦小汤圆阅读 1,876评论 2 15
  • 0.起因 前几天写业务的时候,碰到了这样的需求: checkbox在父DIV的里面,但是checkbox绑定了v-...
    CoderMageFox阅读 934评论 1 0
  • JavaScript与HTML之间的交互是通过事件来实现的,事件就是当文档或者浏览器窗口发生一些特定的交互瞬间,事...
    plainnany阅读 1,007评论 1 2
  • 孩儿倒是挺努力的,也挺上心,有时候我都佩服他,背书写作业都对自己要求完美,就是刚开学的时候听老师说,他上课的时候,...
    詹詹zmz阅读 196评论 0 0