これはあなたがやりたいことに対してうまくいくはずです: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
が呼び出されたとき)、どこでもクリックできます。すべてのイベント リスナーが削除されるため、 associateListener
andfunc
は呼び出されません。