JavaScript中事件句柄函数的this和even.target

由于JavaScript的事件模型中,事件触发开始,有一个捕获阶段和冒泡阶段(详见:关于JavaScript的addEventListener第三个参数的注记)。所以触发元素分为精准触发元素不精准触发元素。例如,在下面的结构中:

假设三个相互嵌套的元素都有一个onclick点击事件句柄。那么当我点击按钮时触发点击事件,那么这个事件可以被这三个元素捕获,那么最内层的按钮元素,也就是我精确点击的元素,我称作:“精准触发元素”;相应的,剩下的两个就是“不精准触发元素”。
那么,由于触发事件句柄的回调函数中,第一个参数总是event实例,它有一个target的属性,指向的就是“精准触发元素”,而在“不精准触发元素”的回调函数中,this指向的就是元素本身,而event.target指向的就是那个“精准触发元素”,二者可以区分
可以想见,在“精准触发元素”的事件函数内部,应该有this===event.target,而事实也确实如此。
如果用原生JavaScript代码或者jQuery都可以验证:

//原生JavaScript
document.getElementById("inner").onclick=function(event){
    console.log(this===event.target)
}
//jQuery+匿名函数
$("#inner").click(function(event){
    console.log(event.target===this)
})

但是当使用箭头函数验证时要格外注意。例如,下面代码验证的是错误的,因为箭头函数的this指向的不是本元素,而是全局变量window

//错误
$("#inner").click((event)=>{
    console.log(event.target===this)
})

我们需要给它手动绑定:

//正常
$("#inner").click((function(){
    return (event)=>{
        console.log(event.target===this)
    }
}).call($("#inner")[0]))

你可能感兴趣的:(JavaScript中事件句柄函数的this和even.target)