由于@rsp answer 正确解决了解除绑定正确处理程序的问题,它并没有真正解决命名空间的问题。
要处理这个问题,你需要做更多这样的编码:
function on(elm, evtName, handler) {
evtName.split('.').reduce(function(evtPart, evt) {
evt = evt ? evt +'.'+ evtPart : evtPart;
elm.addEventListener(evt, handler, true);
return evt;
}, '');
}
function off(elm, evtName, handler) {
evtName.split('.').reduce(function(evtPart, evt) {
evt = evt ? evt +'.'+ evtPart : evtPart;
elm.removeEventListener(evt, handler, true);
return evt;
}, '');
}
// Your handler
function onScroll(e) { ... }
// To bind it
on(window, 'scroll.myScrollNamespace', onScroll);
// To unbind it
off(window, 'scroll.myScrollNamespace', onScroll);
总结一下:这实际上设置了多个事件侦听器 - 一个用于命名空间的每一部分。不幸的是,该功能本身并不支持,但正如您所见,它可以相对简单地实现。请注意,即使此脚本支持深度命名空间(例如scroll.parent.child),它也会绑定大量事件侦听器(在本例中为 3 个),因此是不可取的。
您可能会做得更好,但这可以完成。