Наконец, и после нескольких часов испытаний & ошибок я нашел решение, может быть, это не самый лучший и самый эффективный, но ... IT РАБОТАЕТ! (Протестировано на IE9, Firefox 12, Chrome 18)
Во-первых, я создаю два кросс-браузера и вспомогательные методы 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 = {};
И, наконец, два вызываемая и экспонировали на методы пользователей: СЛЕДУЮЩЕЮ один для добавления события (события) и связать это событие с методом (обработчиком) для определенного элемента (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);
Вот и все, надеюсь, будет полезным для кого-то один день.
Где вы взяли 'bindEvent()'? Что оно делает? – jfriend00
Вы запрашиваете не-jQuery-ответ (например, простой javascript)? – jfriend00
@ jfriend00: он хочет реализовать его самостоятельно - например. ГЭС не использует jQuery, но спрашивает, как это делает jQuery. – prodigitalson