クリックされた後に要素からイベントリスナーを削除しようとしています。機能するソリューションがあるように見えますが、それは理想的ではなく、壊れたコードとは異なる動作をする理由がわかりません。
これを行うにはもっと簡単な方法があることに気づきましたが、これは私が取り組んでいるJSクラスから取得したものなので、構造の一部を保持する必要があります。
これは、正しく回答された以前の投稿に関連しています(ただし、例を展開すると機能しませんでした)-JavaScriptで無名関数呼び出しを使用してイベントリスナーを削除します。
この例では、最後に作成されたdivはリスナーを正しく削除しますが、以前の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);
最後の1つは正常に機能しますが、リスナー配列は必要ないはずです。心配しすぎかもしれませんが、最適な解決策を知りたいです。