複数の同一のイベントリスナーの登録について調べた
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