1

次のコードがあり、func複数の要素に適用される可能性のあるリスナーを含む、すべてのリスナーを削除するのに助けが必要です:

var associateListener = function(event)
{
    var element = event.srcElement||event.target;
    element.addEventListener("click", func, false);
    element.addEventListener("mousedown", func, false);
    element.addEventListener("mouseup", func, false);    
};
var addListeners = function(win)
{
    win.document.addEventListener("click", associateListener, true);
    win.document.addEventListener("mousedown", associateListener, true);
    win.document.addEventListener("mouseup", associateListener, true);
};
var deleteListeners = function(win)
{
    ??
};

私は入れようとしました:

win.document.removeEventListener("click", associateListener, true);
win.document.removeEventListener("mousedown", associateListener, true);
win.document.removeEventListener("mouseup", associateListener, true);

ただし、要素に関連付けられているリスナーは削除されませんでした。これらのリスナーも削除したいと思います。

4

1 に答える 1

2

これはあなたがやりたいことに対してうまくいくはずです:http://jsfiddle.net/7jQJj/3/

var elesBound = []
var func = function () {
    console.log("func from ele: "+this.tagName+"(id: "+this.id+")");
}
var associateListener = function (event) {
    console.log("associateListener");
    var element = event.srcElement || event.target;
    element.addEventListener("click", func, false);
    element.addEventListener("mousedown", func, false);
    element.addEventListener("mouseup", func, false);
    elesBound.push(element);
};
var addListeners = function (win) {
    console.log("addListeners");
    win.document.addEventListener("click", associateListener, true);
    win.document.addEventListener("mousedown", associateListener, true);
    win.document.addEventListener("mouseup", associateListener, true);
};
var deleteListeners = function (win) {
    console.log("deleteListeners");
    win.document.removeEventListener("click", associateListener, true);
    win.document.removeEventListener("mousedown", associateListener, true);
    win.document.removeEventListener("mouseup", associateListener, true);
    for (var i = 0; i < elesBound.length; i++) {
        elesBound[i].removeEventListener("click", func, false);
        elesBound[i].removeEventListener("mousedown", func, false);
        elesBound[i].removeEventListener("mouseup", func, false);
    }
    elesBound = [];
};
document.getElementById("removeListeners").addEventListener("click", function () {
    deleteListeners(window);
});
addListeners(window);

基本的に、どの要素が func にバインドされているかを追跡するリストを保持し、deleteListeners でそれらをすべてバインド解除します。

コンソールに表示される例:

addListeners
associateListener 
func from ele: DIV(id: d2) 
associateListener 
func from ele: DIV(id: d2) 
associateListener 
func from ele: DIV(id: d2) 
associateListener 
func from ele: DIV(id: d1) 
associateListener 
func from ele: DIV(id: d1) 
associateListener 
func from ele: DIV(id: d1) 
associateListener 
func from ele: BUTTON(id: removeListeners) 
associateListener 
func from ele: BUTTON(id: removeListeners) 
associateListener 
deleteListeners 

この後 (deleteListenersが呼び出されたとき)、どこでもクリックできます。すべてのイベント リスナーが削除されるため、 associateListenerandfuncは呼び出されません。

于 2013-07-02T12:53:26.313 に答える