我一直想知道这种方法的清洁程度 - 在事件侦听器内部删除事件侦听器。
更新:
在内部,我保留了对象和侦听器的哈希表,因此我可能可以从任何地方删除事件侦听器。 我只是担心从自身内部删除它是否有效?
更新:
我正在询问addEventListener,removeEventListener 等内容。
我一直想知道这种方法的清洁程度 - 在事件侦听器内部删除事件侦听器。
更新:
在内部,我保留了对象和侦听器的哈希表,因此我可能可以从任何地方删除事件侦听器。 我只是担心从自身内部删除它是否有效?
更新:
我正在询问addEventListener,removeEventListener 等内容。
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 });
从上面的文档链接中可以看出,现代浏览器的支持情况良好,但不适用于Internet Explorer。
我之所以看到这个,是因为我也有同样的问题!
arguments.callee 是你的朋友...
那么你会有
blah.addEventListener('click',function(e){
e.source.removeEventListener('click', arguments.callee);
blee bloo bleep
});
blah.addEventListener('click', anyThingYouWantHere = function(e){
e.source.removeEventListener('click', anyThingYouWantHere);
blee bloo bleep
});
在这里,“anythingYouWantHere”是您想要的任何变量名称 ~ 当您添加函数时,您实际上正在“命名”该函数。
我刚刚编写了一个包装函数,用于生成自毁事件监听器:
let addSelfDestructingEventListener = (element, eventType, callback) => {
let handler = () => {
callback();
element.removeEventListener(eventType, handler);
};
element.addEventListener(eventType, handler);
};
到目前为止,它运行得非常好:)
@bharal的答案给了我以下解决方案:
//example
addBlurListener(element, field) {
const listenToBlur = (e) => {
e.target.removeEventListener(e.type, listenToBlur);
//your stuff
};
element.addEventListener('blur', listenToBlur);
},
some_div.onclick = function () {
...
this.onclick = null;
// or: some_div.onclick = null;
};
或者你关心的是事件监听器?因为它们稍微有点复杂。
element.addEventListener('eventname', function callback(){}, { once: true });
function addOneTimeEventListener(element, event, callback) {
const wrapper = e => {
try {callback(e)} finally {
element.removeEventListener(event, wrapper);
};
}
element.addEventListener(event, wrapper);
}
// example
addOneTimeEventListener(document.body, 'click', e => {
console.log('this message only show once.');
});
如果你想决定何时移除监听器:
function addEventListener(element, event, callback) {
const wrapper = e => {
callback(e, () => element.removeEventListener(event, wrapper));
}
element.addEventListener(event, wrapper);
}
// example
let count = 0;
addEventListener(document.body, 'click', (e, closeListener) => {
console.log(`click:${++count}`);
if(count == 3) closeListener();
});
addEventListener
还是.onxxx =
? - Roatin Marth