Wreszcie, po wielu godzinach prób & błędów znalazłem rozwiązanie, może to nie jest najlepszy i najbardziej wydajny ale ... PRACE! (Testowane na IE9, Firefox 12, Chrome 18)
Najpierw tworzę dwie różne przeglądarki i pomocnicze metody addEvent() i removeEvent(). (Pomysł zaczerpnięty z kodu źródłowego Jquery'ego!)
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]);
}
}
Również musimy jakąś „kontener” do przechowywania załączonego zdarzeń do elementów, takich jak to:
HELPERS.EVTS = {};
i wreszcie dwa wymagalne i narażone na Metod użytkowników: następnego jeden do dodania zdarzenia (zdarzenia) i powiązania tego zdarzenia z metodą (handler) dla określonego elementu (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;
}
Wreszcie sposób, że un-dołączyć co wcześniej dołączone zdarzeń (Event) w odniesieniu do konkretnego elementu (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;
}
Nawiasem mówiąc, do wywołania tej metody należy wykonać następujące czynności: przechwytywania DOM Węzeł
var a = document.getElementById('some_id');
połączenia metoda "bindEvent() z odpowiednimi parametrami.
bindEvent('click',function(){alert('say hi');},a);
I de-podłączyć go:
removeAllEvent('click',a);
To wszystko, mam nadzieję, będą przydatne dla kogoś jednego dnia.
Skąd otrzymałeś 'bindEvent()'? Co to robi? – jfriend00
Pytasz o odpowiedź niezwiązaną z jQuery (np. Zwykły javascript)? – jfriend00
@ jfriend00: chce go wdrożyć na własną rękę - np. nie używa jQuery, ale pyta, jak robi to jQuery. – prodigitalson