Я пытаюсь удалить прослушиватели событий из элементов после того, как они были нажаты, и хотя у меня, похоже, есть рабочее решение, оно не идеально, и я не уверен, почему оно работает иначе, чем сломанный код.
Хотя я понимаю, что есть более простые способы сделать это, это взято из класса JS, над которым я работаю, поэтому нужно сохранить часть структуры.
Это относится к предыдущему посту, на который я ответил правильно (но не работал, когда я расширил пример) - Удаление прослушивателей событий с анонимными вызовами функций в 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);
Последний работает нормально, но я уверен, что массив слушателей не нужен. Может быть, я слишком беспокоюсь, но я хотел бы знать оптимальное решение.