这个问题答案很简单,但困扰了我两年,先上代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS事件穿透</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
</head>
<body>
<div id="outDiv" data-info="out" style="border: 1px solid black;padding: 10px;">
Out
<div id="innerDIv" data-info="inner" style="border: 1px solid red;padding: 5px;">
Inner
</div>
</div>
</body>
<script>
$("#outDiv").click(function (e) {
console.log(e.target.dataset.info)
})
</script>
</html>
效果图:
在这段代码中,我想要实现的效果是点击Out名字的div,获取到data-info为out的信息,点击Out里面的子元素的时候,也返回我绑定事件的Out的Div的data-info的信息,但现在问题出在,当我点击Inner的div的时候,返回的是Inner这个div上的datainfo的信息,效果如图:
我很苦恼,因为父元素里面可能会有很多子元素,一一处理起来很那,我最开始的做法是把父元素内所有的子元素都加上data-info属性,且值都和父元素一致,但这实在是一种蠢方法。网上常有的阻止事件穿透与事件冒泡,也与我的需求和场景不符。后来我打印e的时候,柳岸花明了:
原来,e是有一个属性,叫做currentTarget,它返回的,永远是你绑定事件的元素,而不是当前触发事件的元素。
至此问题圆满解决,我想要的,就是currentTarget。
PS:之前懒惰,在每个子元素里都添加data-info信息,现在想想实在太傻叉了。任何问题一定有解决方案,逃避是解决不了问题的,哈哈