我试图在点击之后从元素中删除事件监听器,虽然我似乎有一个可行的解决方案,但它并不理想,我不确定为什么它对破坏的代码有不同的作用。
虽然我意识到有更简单的方法可以做到这一点,但这是从我正在研究的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);
最后一个工作正常,但我确定听众数组不应该是必要的。也许我太担心了,但我想知道最佳解决方案。
先谢谢你的帮助,
干杯, 富
答案 0 :(得分:2)
你是对的,你不需要一个数组,只需在变量中保存每个监听器,而不是在remove()函数中传递eventlistener,
var ctnr = document.getElementById('ctnr');
function removeDiv(d, ev) {
alert('testing');
d.removeEventListener('click', ev, false);
}
function addDiv() {
var div = document.createElement('div');
div.innerHTML = 'test';
ctnr.appendChild(div);
div.addEventListener('click', (function(d) {
var myfunc;
return myfunc = function() {
removeDiv(d, myfunc);
}
})(div), false);
}
addDiv();
addDiv();
addDiv();
document.getElementById('btn').addEventListener('click', function() {
alert(listeners);
}, false);
答案 1 :(得分:1)
如果它们不相等,您必须保存每个侦听器,因此您需要侦听器和元素之间的关系。由于元素由对象(DOM:文档对象模型)表示,您可以向它们添加自定义属性(尽管不建议这样做:Can I add arbitrary properties to DOM objects?)(demo):
var ctnr = document.getElementById('ctnr');
function removeDiv (d) {
alert('testing');
d.removeEventListener('click', d.custom_Listener , false);
}
function addDiv () {
var div = document.createElement('div');
div.innerHTML = 'test';
div.custom_Listener = function(){removeDiv(this)};
ctnr.appendChild(div);
div.addEventListener('click', div.custom_Listener , false);
}
但是因为你在每个div中使用相同的监听器,所以最好不要为每个div使用单独的函数,但是相同(demo):
var ctnr = document.getElementById('ctnr');
var listener = function(){
removeDiv(this);
};
function removeDiv (d) {
alert('testing');
d.style.backgroundColor = '#36f';
d.removeEventListener('click', listener, false);
}
function addDiv () {
var div = document.createElement('div');
div.innerHTML = 'test';
ctnr.appendChild(div);
div.addEventListener('click', listener , false);
}