我总是想知道这种方法有多干净 - 从那个侦听器中删除一个事件监听器。
更新
在内部我保留了对象和侦听器的哈希值,因此我可以从任何地方删除事件侦听器。我只关心将它从内部移除。这样的行动实际上会起作用吗?
更新
我在询问addEventListener,removeEventListener的内容。
答案 0 :(得分:9)
我刚刚看到这个,因为我想知道完全同样的问题!
arguments.callee是你的朋友......
所以你有
blah.addEventListener('click',function(e){
e.source.removeEventListener('click', arguments.callee);
blee bloo bleep
});
这适用于Titanium Appcelerator,所以 也应该在javascript中工作(因为它们是同一件事)
请勿在此示例中将()
添加到arguments.callee的末尾,除非您希望看到...... bah dum tish!。
事实上,如果你不想使用arguments.callee,这也可能有效(未经测试):
blah.addEventListener('click', anyThingYouWantHere : function(e){
e.source.removeEventListener('click', anyThingYouWantHere);
blee bloo bleep
});
“anythingYouWantHere”是你想要的任何变量名称〜你在添加它时有效地“命名”了这个函数。
答案 1 :(得分:1)
您可以尝试这样的方式,具体取决于它的调用方式:
some_div.onclick = function () {
...
this.onclick = null;
// or: some_div.onclick = null;
};
或者您关注的是事件听众吗?因为那些有点复杂。
答案 2 :(得分:1)
您可以通过once
选项来使侦听器仅执行一次操作,然后将其删除。文件:https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters
示例:
element.addEventListener('eventname', (ev) => {
console.log("event is captured only once.");
// do more stuff...
}, { once: true });
从上面相同的docs链接来看,现代的浏览器支持不错,但Internet Explorer无法使用。
答案 3 :(得分:0)
如果你使用jQuery,你可能会有一些方便的方法暴露与事件处理程序交互 - 请参阅bind()/ unbind(),delegate()/ undelegate(),one()和similar methods 。
我对其他框架没有太多经验,但我认为它们提供类似的功能。如果您根本没有使用框架,@ ssleihssirhc有一个可接受的答案。
编辑:啊,也许你正在寻找更像addEventListener()和removeEventListener()的东西。同样,框架将为您的交互提供一些便利,并在某些情况下为您省去重新发明轮子的麻烦。答案 4 :(得分:0)
我刚刚制作了一个包装函数,该函数可以生成自毁事件监听器:
float
到目前为止,效果很好:)
答案 5 :(得分:0)
@bharal的答案现在给了我这个解决方案:
//example
addBlurListener(element, field) {
const listenToBlur = (e) => {
e.target.removeEventListener(e.type, listenToBlur);
//your stuff
};
element.addEventListener('blur', listenToBlur);
},