事件流的捕获和冒泡 ---- 事件对象

浏览器最初开始支持事件时,同一个事件仅仅只有一个元素相应。后来认为仅仅支持一个单一事件是不够的,而IE4以后提出了事件流的概念,一个元素能够支持多个事件。常见的事件流有捕捉型事件和冒泡型事件

 

一、事件捕获
捕获型事件:事件从最不精确的对象(document 对象)开始触发,而后到最精确(也能够在窗口级别捕获事件,不过必须由开发人员特别指定)css

二、事件冒泡
冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。html

为了更好地体会,咱们如今写一个demo,html 和 css 以下:浏览器

 

打开浏览器查看,效果以下:函数

接下来,我须要给它添加一些JS代码:this

var d1 = document.getElementById("d1");
var d2 = document.getElementById("d2");
var d3 = document.getElementById("d3");

d1.addEventListener("click",function(){
      this.style.background = "orange";
      console.log(111);
})
d2.addEventListener("click",function(){
      this.style.background = "green";
      console.log(222);
})
d3.addEventListener("click",function(){
      this.style.background = "blue";
      console.log(333);
})

如今,当咱们点击最外层的圆d1时:spa

当咱们点击中间的圆d2时:code

当咱们点击最里面的圆d3时:htm

【现象】:对象

在d1中点击时,打印结果为:111
在d2中点击时,打印结果为:222,111
在d3中点击时,打印顺序是:333,222,111
 
【结论】: 事件的触发顺序自内向外,这就是事件冒泡。
 
这是由于,addEventListener("事件",函数,Boolean)第三个参数默认值为false,因此会有事件冒泡的发生。
true - 事件句柄在捕获阶段执行
false- 事件句柄在冒泡阶段执行
 

this和e.target的异同

如今,咱们给刚刚的 圆形d1 添加两行JS代码:blog

而后咱们按顺序分别点击圆 d1, d2, d3 , 看一下 this 和 event.target 在控制台上分别打印的结果:

【结论】:

js中事件是会冒泡的,因此this不必定是直接接受事件的目标DOM,

但event.target不会变化,它永远是直接接受事件的目标DOM元素;

相关文章
相关标签/搜索