2016-08-31 158 views
0

是否可以将事件添加到窗口上的子对象上,它将接受来自任何位置(如窗口)的事件?将事件侦听器添加到窗口的子对象中

因此,举例来说:

window.myVariable.addEventListener('keydown', doKeyDown); 

这样我可以删除此特定键按下事件,而不移除被贴在车窗等的keydown事件。

这是怎么回事?

+0

这是什么'myVariable'?谁将解雇这个'keydown'事件? –

+0

'myVariable'可以是任何东西。我想基本上我想为特定事件做一个包装,然后我可以循环并移除它们 –

+0

因此,应该由您的应用程序来触发这些事件(与浏览器相反,就像'onclick'一样)? –

回答

1

您可以创建一个在“名称空间”上运行的简单注册表。

(function() { 
 

 
    var register = {}; 
 

 
    function addNamedListener(namespace, eventType, callback) { 
 
    register[namespace] = register[namespace] || []; 
 
    register[namespace].push({ 
 
     eventType: eventType, 
 
     callback: callback 
 
    }); 
 

 
    window.addEventListener(eventType, callback); 
 
    } 
 

 
    function removeNamedListener(namespace) { 
 
    register[namespace].forEach(function(event) { 
 
     window.removeEventListener(event.eventType, event.callback); 
 
    }); 
 
    } 
 

 
    window.WindowEvents = { 
 
    addNamedListener: addNamedListener, 
 
    removeNamedListener: removeNamedListener 
 
    } 
 

 
})(); 
 

 
// Attach a general window event to the actual window 
 
window.addEventListener('click', function(e) { 
 
    console.log(e.target); 
 
}); 
 

 
// Attach a namedspaced event 
 
WindowEvents.addNamedListener('windowClicks', 'click', function(e) { 
 
    console.log(e.target); 
 
}); 
 

 
// Attach another event to the same namespace 
 
WindowEvents.addNamedListener('windowClicks', 'click', function(e) { 
 
    console.log(e.clientX); 
 
}); 
 

 
// Attach a new event to a different namespace 
 
WindowEvents.addNamedListener('down', 'mousedown', function(e) { 
 
    console.log('Mouse down occurred'); 
 
});
<div>Click Me</div>

然后,当你准备好摆脱在“命名空间”的活动,你只需做到这一点:

WindowEvents.removeNamedListener('windowClicks'); 

这将使原来的窗口事件以及创建的其他名称空间事件(down)。

这应该至少让你开始。

+0

我最终做了一件非常相似的事情。我创建了两个类,一个用事件数组来管理事件,另一个用来保存有关事件(被添加到数组中)的信息。然后我可以将项目添加到数组中,然后遍历数组来删除事件。 –

0

不是真的,尽管您可以将处理程序分配给例如body元素。

这样我就可以删除这个特定的按键事件,而不需要删除附加到窗口的其他keydown事件。

虽然这听起来像是X-Y问题。

removeEventListener要求您指定哪个您要删除的事件侦听器。

removeEventListener('keydown', doKeyDown); 

...所以默认行为是“没有删除其他keydown事件”。

相关问题