JS事件对象中 target 和 currentTarget 的区别

JavaScript021

JS事件对象中 target 和 currentTarget 的区别,第1张

今天我们就来简单谈谈JavaScript的Event事件对象中 target 和 currentTarget 两者之间的区别吧~

我们知道,想要获取某事件所绑定的元素,通常我们可以直接使用 this 对象即可。比如:

稍微给它们加点样式:

页面效果如下:

其中绿色盒子 id 为 box ,而红色盒子 id 为 container ,绿盒子是红盒子的子元素。现在,我给它们分别添加点击事件,目的是获取它们的 id 属性。

可以看到,只要我们给哪个元素绑定点击事件,那么事件执行时通过 this 所获取到的元素就是绑定点击事件的那个元素。

但是,并不是任何时候我们都可以通过 this 来获取当前绑定事件元素,比如当我们使用箭头函数或使用Vue.js框架时, this 就“失效”了。

有关箭头函数为什么会导致 this 指向问题,请戳→ ES6之箭头函数 。

这里的 this 指向的是当前Vue组件实例,所以 this.id 自然获取的是 data 中的 id 而不是 container 了。

那么,对于这个问题我们该如何解决呢?如何才能正确获取到当前绑定事件元素呢?

这时我们就需要用到事件对象中的 target 和 currentTarget 属性了。

我们看到,通过 target 和 currentTarget 都成功获取到了点击事件所绑定的DOM元素,那么 target 和 currentTarget 之间又有什么区别呢?

其实,只要我们将事件处理程序直接绑定到目标元素,那么目标元素事件执行时, target 和 currentTarget 均指向的是该目标元素。然而,如果事件处理程序并未绑定在目标元素,而是在其祖先元素上时,那么 target 则指向的是该目标元素,而 currentTarget 指向的是当前绑定事件的祖先元素。

可能看起来比较难理解,我们还是用最开始那个例子吧。

此时,只要 foo() 执行,那么 e.currentTarget.id 的值必然是 container ,因为 currentTarget 永远指向的是 事件所绑定的元素 (这里点击事件直接绑定在container元素上)。

但是 target 则不同,它指向的是 事件实际执行所在的元素 ,所以本例中 e.target.id 的值取决于鼠标直接所点击的元素。

① 鼠标直接点击container元素,也就是红色部分

这时 target 和 currentTarget 均指向的是container元素,因为事件执行的目标和事件绑定的目标是相同的,都是container元素。

② 鼠标直接点击box元素,也就是绿色部分

这时 target 指向的是box元素,而 currentTarget 指向的是container元素,因为事件执行的直接目标是box元素。

事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。

假设一个元素div,它有一个下级元素p。

元素

这两个元素都绑定了click事件,如果用户点击了p,它在div和p上都触发了click事件,那这两个事件处理程序哪个先执行呢?事件顺序是什么?

两种模型

以前,netscape和microsoft是不同的实现方式。

netscape中,div先触发,这就叫做事件捕获。

microsoft中,p先触发,这就叫做事件冒泡。

两种事件处理顺序刚好相反。ie只支持事件冒泡,mozilla,

opera

7

konqueror两种都支持,旧版本的opera's

icab两种都不支持

事件捕获

当你使用事件捕获时,父级元素先触发,子级元素后触发,即div先触发,p后触发。

事件冒泡

当你使用事件冒泡时,子级元素先触发,父级元素后触发,即p先触发,div后触发。

w3c模型

w3c模型是将两者进行中和,在w3c模型中,任何事件发生时,先从顶层开始进行事件捕获,直到事件触发到达了事件源元素。然后,再从事件源往上进行事件冒泡,直到到达document。

程序员可以自己选择绑定事件时采用事件捕获还是事件冒泡,方法就是绑定事件时通过addeventlistener函数,它有三个参数,第三个参数若是true,则表示采用事件捕获,若是false,则表示采用事件冒泡。

ele.addeventlistener('click',dosomething2,true)

true=捕获

false=冒泡

传统绑定事件方式

在一个支持w3c

dom的浏览器中,像这样一般的绑定事件方式,是采用的事件冒泡方式。

ele.onclick

=

dosomething2

ie浏览器

如上面所说,ie只支持事件冒泡,不支持事件捕获,它也不支持addeventlistener函数,不会用第三个参数来表示是冒泡还是捕获,它提供了另一个函数attachevent。

ele.attachevent("onclick",

dosomething2)

附:事件冒泡(的过程):事件从发生的目标(event.srcelement||event.target)开始,沿着文档逐层向上冒泡,到document为止。

事件的传播是可以阻止的:

在w3c中,使用stoppropagation()方法

在ie下设置cancelbubble

=

true;

在捕获的过程中stoppropagation();后,后面的冒泡过程也不会发生了~

3.阻止事件的默认行为,例如click

后的跳转~

在w3c中,使用preventdefault()方法;

在ie下设置window.event.returnvalue

=

false