Javascript 如何获取不在父元素中激发的事件

Javascript 如何获取不在父元素中激发的事件,javascript,events,scope,Javascript,Events,Scope,假设我有一个只有h1和div元素的html文档。div是一个简单的正方形,以背景色显示 如果我使用仅使用JS代码(通过使用addEventListener)附加click事件的常规方法,那么当仅单击Div时,函数fOnClick会正确执行。当单击H1或其他地方的文档时,函数不会完全按照预期执行 但是在评论dDragger.addEventListener时。。行,并取消对MyStuff.Events.bOn的注释。。第行(要启用事件处理模块),单击Div时也会正确执行函数fOnClick,但单击

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

如果我使用仅使用JS代码(通过使用addEventListener)附加click事件的常规方法,那么当仅单击Div时,函数fOnClick会正确执行。当单击H1或其他地方的文档时,函数不会完全按照预期执行

但是在评论dDragger.addEventListener时。。行,并取消对MyStuff.Events.bOn的注释。。第行(要启用事件处理模块),单击Div时也会正确执行函数fOnClick,但单击H1或文档中的其他位置时也会(错误!)执行函数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'))