0

EDIT : データをフェッチしてページのコンテンツをリロードする 1 つの関数を呼び出す必要があります。ただし、これは、別の関数がデータ (webSql) をフェッチした後に呼び出す必要があります。変数が範囲外であるため、WebSql コールバックを使用できません。そこで、カスタム イベントを作成し、2 番目の関数スコープにリスナーを追加しました。したがって、データがフェッチされると、最初の関数スコープでイベントがディスパッチされます。ページが複数回リロードされた場合の問題であり、リスナーが複数回追加され、すべてが呼び出されますが、これは望ましくありません。

カスタム イベントをリッスンする関数が 1 つだけであることを確認する必要があります。現在、次のように呼び出されたリスナーを削除しています。

document.addEventListener("customEvent", function () {
  actualCallBack(var1, var2); // Since I need to pass parameters I need to use callBack within an anonymous function.
  this.removeEventListener("customEvent", arguments.callee, false);
}, false);

しかし問題は、匿名関数が最初に呼び出された後にのみ削除されることです。リスナーが複数回追加される可能性があります。新しいリスナーを追加する前にイベントリスナーを削除するにはどうすればよいですか?

document.removeEventListener("customEvent");
document.addEventListener(...);

代わりに変数関数が使用されていれば削除できたかもしれませんが、コールバックにいくつかのパラメーターを渡す必要があるため、匿名関数を使用する必要があります。

4

3 に答える 3

2

フェリックスの提案を使用して

var setSingletonEventListener = (function(element){
    var handlers = {};
    return function(evtName, func){
        handlers.hasOwnProperty(evtName) && element.removeEventListener(evtName, handlers[evtName]);
        if (func) {
            handlers[evtName] = func;
            element.addEventListener(evtName, func);
        } else {
            delete handlers[evtName];
        }
    };
})(document);

setSingletonEventListener("custom event", function(){

});

//replaces the previous
setSingletonEventListener("custom event", function(){

});

//removes the listener, if any
setSingletonEventListener("custom event");
于 2013-06-30T14:33:41.703 に答える