Javascript 如何获取不在父元素中激发的事件
假设我有一个只有h1和div元素的html文档。div是一个简单的正方形,以背景色显示 如果我使用仅使用JS代码(通过使用addEventListener)附加click事件的常规方法,那么当仅单击Div时,函数fOnClick会正确执行。当单击H1或其他地方的文档时,函数不会完全按照预期执行 但是在评论dDragger.addEventListener时。。行,并取消对MyStuff.Events.bOn的注释。。第行(要启用事件处理模块),单击Div时也会正确执行函数fOnClick,但单击H1或文档中的其他位置时也会(错误!)执行函数fOnClick 我错过什么了吗?是否存在未捕获的范围Javascript 如何获取不在父元素中激发的事件,javascript,events,scope,Javascript,Events,Scope,假设我有一个只有h1和div元素的html文档。div是一个简单的正方形,以背景色显示 如果我使用仅使用JS代码(通过使用addEventListener)附加click事件的常规方法,那么当仅单击Div时,函数fOnClick会正确执行。当单击H1或其他地方的文档时,函数不会完全按照预期执行 但是在评论dDragger.addEventListener时。。行,并取消对MyStuff.Events.bOn的注释。。第行(要启用事件处理模块),单击Div时也会正确执行函数fOnClick,但单击
<!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>
事件
var MyStuff=MyStuff | |{};
MyStuff.Events=(函数(oEvents){
oEvents.bOn=函数(oElement,sEventName,fCallback){
var fListenerMethod=oElement.addEventListener | | oElement.attachEvent,
sEventName=oElement.addEventListener?sEventName:'on'+sEventName;
return fListenerMethod(sEventName,fCallback)?true:false;
};
返回事件;
}(MyStuff.Events | |{});
var fOnClick=函数(e){
e、 预防默认值();
console.log(“fOnClick”);
返回false;
};
dDragger=document.getElementById(“dragger”);
//dDragger.addEventListener(“单击”,fOnClick);
MyStuff.Events.bOn(dDragger,“click”,fOnClick);
问题在于:
return fListenerMethod(sEventName, fCallback) ? true : false;
按原样返回,那里的flisteremethod
(现代浏览器中的addEventListener
函数)未绑定到传递到bOn
的元素。因此,它假设全局调用上下文,这意味着在文档的任何位置单击都将触发事件:
addEventListener('click',()=>console.log('clicked'))
!