最後に、何時間ものテストとエラーの後、私は解決策を見つけました。おそらくそれは最善または最も効率的ではありませんが...それは機能します! (IE9、Firefox 12、Chrome 18でテスト済み)
まず、2 つのクロスブラウザーと補助的な addEvent() および removeEvent() メソッドを作成します。(Jquery のソース コードからのアイデアです!)
HELPERS.removeEvent = document.removeEventListener ?
function( type, handle,el ) {
if ( el.removeEventListener ) {
//W3C Standard
el.removeEventListener( type, handle, true );
}
} :
function( type, handle,el ) {
if ( el.detachEvent ) {
//The IE way
el.detachEvent( 'on'+type, el[type+handle] );
el[type+handle] = null;
}
};
HELPERS.addEvent = document.addEventListener ?
function( type, handle,el ) {
if ( el.addEventListener ) {
//W3C Standard
el.addEventListener( type, handle, true );
}
} :
function( type, handle,el ) {
if ( el.attachEvent ) {
//The IE way
el['e'+type+handle] = handle;
el[type+handle] = function(){
handle.call(el,window.event);
};
el.attachEvent( 'on'+type, el[type+handle] );
}
}
また、次のように、要素に添付されたイベントを格納するための「コンテナ」が必要です。
HELPERS.EVTS = {};
最後に、呼び出し可能でユーザーに公開される 2 つのメソッド: イベント (event) を追加し、このイベントを特定の要素 (el) のメソッド (ハンドラー) に関連付ける次のメソッド。
function bindEvent(event, handler,el) {
if(!(el in HELPERS.EVT)) {
// HELPERS.EVT stores references to nodes
HELPERS.EVT[el] = {};
}
if(!(event in HELPERS.EVT[el])) {
// each entry contains another entry for each event type
HELPERS.EVT[el][event] = [];
}
// capture reference
HELPERS.EVT[el][event].push([handler, true]);
//Finally call the aux. Method
HELPERS.addEvent(event,handler,el);
return;
}
最後に、特定の要素 (el) に対して事前に添付されたすべてのイベント (イベント) を添付解除する方法
function removeAllEvent(event,el) {
if(el in HELPERS.EVT) {
var handlers = HELPERS.EVT[el];
if(event in handlers) {
var eventHandlers = handlers[event];
for(var i = eventHandlers.length; i--;) {
var handler = eventHandlers[i];
HELPERS.removeEvent(event,handler[0],el);
}
}
}
return;
}
ところで、このメソッドを呼び出すには、次のことを行う必要があります: DOM ノードをキャプチャする
var a = document.getElementById('some_id');
対応するパラメーターを指定してメソッド「bindEvent()」を呼び出します。
bindEvent('click',function(){alert('say hi');},a);
そしてそれを外すには:
removeAllEvent('click',a);
それだけです、希望はいつか誰かの役に立ちます。