【发布时间】:2012-04-06 09:33:55
【问题描述】:
我试图在元素被点击后从元素中删除事件监听器,虽然我似乎有一个可行的解决方案,但这并不理想,我不确定为什么它与损坏的代码不同。
虽然我意识到有更简单的方法可以做到这一点,但这取自我正在研究的一个 JS 类,因此需要保留一些结构。
这与我之前发表的一篇文章有关,该文章得到了正确回答(但在我扩展示例时不起作用)-Removing event listeners with anonymous function calls in JavaScript。
在此示例中,最后创建的 div 正确删除了侦听器,但较早的未正确删除(此处为小提琴 - http://jsfiddle.net/richwilliamsuk/NEmbd/):
var ctnr = document.getElementById('ctnr');
var listener = null;
function removeDiv (d) {
alert('testing');
d.removeEventListener('click', listener, false);
}
function addDiv () {
var div = document.createElement('div');
div.innerHTML = 'test';
ctnr.appendChild(div);
div.addEventListener('click', (function (d) { return listener = function () { removeDiv(d); } })(div), false);
}
addDiv();
addDiv();
addDiv();
在我开始工作的版本中,我创建了一个包含所有侦听器的数组(此处为小提琴 - http://jsfiddle.net/richwilliamsuk/3zZRj/):
var ctnr = document.getElementById('ctnr');
var listeners = [];
function removeDiv(d) {
alert('testing');
d.removeEventListener('click', listeners[d.id], false);
}
function addDiv() {
var div = document.createElement('div');
div.innerHTML = 'test';
ctnr.appendChild(div);
div.id = listeners.length;
div.addEventListener('click', (function(d) {
return listeners[listeners.length] = function() {
removeDiv(d);
}
})(div), false);
}
addDiv();
addDiv();
addDiv();
document.getElementById('btn').addEventListener('click', function() {
alert(listeners);
}, false);
最后一个工作正常,但我确信侦听器数组不是必需的。可能是我太担心了,但我想知道最佳解决方案。
【问题讨论】:
标签: javascript event-handling dom-events event-listener