gpt4 book ai didi

javascript - 如何让事件不在父元素中触发

转载 作者:行者123 更新时间:2023-11-30 14:37:49 25 4
gpt4 key购买 nike

假设我有一个只有 h1 和 div 元素的 html 文档。 div 是一个简单的正方形,使用背景色显示。

如果我使用仅使用 JS 代码(通过使用 addEventListener)附加单击事件的正常方式,则仅在单击 Div 时才能正确执行 fOnClick 函数。当单击 H1 或其他地方的文档时,该功能并未执行,这与预期完全一样。

但是当注释 dDragger.addEventListener.. 行并取消注释 MyStuff.Events.bOn.. 行(以启用事件处理模块)时,函数 fOnClick 在单击 Div 时也会正确执行,但是 ALSO (错误!)在单击 H1 或文档中的其他位置时执行!

我错过了什么吗?是否有未捕获的作用域?

<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>Events</h1>
<div id="dragger" style="width:50px; height:50px; background-color: #444;"></div>

<script>

var MyStuff = MyStuff || {};
MyStuff.Events = (function (oEvents) {

oEvents.bOn = function (oElement, sEventName, fCallback) {
var fListenerMethod = oElement.addEventListener || oElement.attachEvent,
sEventName = oElement.addEventListener ? sEventName : 'on' + sEventName;
return fListenerMethod(sEventName, fCallback) ? true : false;
};

return oEvents;
}(MyStuff.Events || {}));

var fOnClick = function(e) {
e.preventDefault();
console.log("fOnClick");
return false;
};

dDragger = document.getElementById("dragger");

//dDragger.addEventListener("click", fOnClick);
MyStuff.Events.bOn(dDragger, "click", fOnClick);

</script>
</body>
</html>

最佳答案

问题出在这里:

return fListenerMethod(sEventName, fCallback) ? true : false;

按原样返回,fListenerMethod(在现代浏览器中是 addEventListener 函数)未绑定(bind)到传递给 bOn 的元素>。因此,它采用全局调用上下文,这意味着在文档的任何位置单击都会触发该事件:

addEventListener('click', () => console.log('clicked'))

您应该使用适当的调用上下文 (oElement) 来调用该函数:

return fListenerMethod.call(oElement, sEventName, fCallback) ? true : false;

<h1>Events</h1>
<div id="dragger" style="width:50px; height:50px; background-color: #444;"></div>

<script>
var MyStuff = MyStuff || {};
MyStuff.Events = (function(oEvents) {

oEvents.bOn = function(oElement, sEventName, fCallback) {
var fListenerMethod = oElement.addEventListener || oElement.attachEvent,
sEventName = oElement.addEventListener ? sEventName : 'on' + sEventName;
return fListenerMethod.call(oElement, sEventName, fCallback) ? true : false;
};

return oEvents;
}(MyStuff.Events || {}));

var fOnClick = function(e) {
e.preventDefault();
console.log("fOnClick");
return false;
};

dDragger = document.getElementById("dragger");

//dDragger.addEventListener("click", fOnClick);
MyStuff.Events.bOn(dDragger, "click", fOnClick);
</script>

关于javascript - 如何让事件不在父元素中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50145913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com