複数の同一のイベントリスナーの登録について調べた

FixScrollアドオンで、複数の同一のイベントリスナーを登録すると、複数回リスナーしない。(勘違いだったことが分かった)


EventTarget.addEventListener() - Web API | MDNを改めてみてみると以下のように記載してあり、そのとおりの動作をしていた。

複数の同一のイベントリスナー

複数の同一の EventListener が、同じ EventTarget に同じ引数で登録された場合、重複するインスタンスは反映されません。EventListener が 2 度呼び出されることはなく、重複するインスタンスは反映されないので、removeEventListener で手動で削除する必要はありません。


同一という文言がどこからどこまでなのか調べることにする。


環境はFirefox10.0のgBrowser上。

結果 記載のとおり。

listener部分が==であれば、2度呼び出されませんでした。

function hoge(){alert("hogehoge");}
var haveHandle ={
    handleEvent :function(aEvent) {
        switch (aEvent.type)
        {
            case 'command':
                alert("haveHandle");
        }
    }
}

という関数およびobjectをelement.id="button1"のlistenerにしました。

[OK] functionを直接listenerに指定(非推奨)
button1.addEventListener("command", hoge ,false);
button1.addEventListener("command", hoge ,false);
var onlyFunc = hoge == hoge;
Application.console.log("hoge == hoge -> " + onlyFunc);//true
[NG] function(){}内に関数指定してlistenerに指定(推奨)
button1.addEventListener("command", function(){hoge();},false);
button1.addEventListener("command", function(){hoge();},false);
var methodInFunc = function(){hoge();} == function(){hoge();};
Application.console.log("function(){hoge();} == function(){hoge();} -> " + methodInFunc);//false

こちらは2度呼び出されることになります。

[OK} objectをlistenerに指定
button1.addEventListener("command", haveHandle ,false);
button1.addEventListener("command", haveHandle ,false);
var objectNoChange = haveHandle == haveHandle;
Application.console.log("haveHandle == haveHandle -> " + objectNoChange);//true