Infine, e dopo ore di test & errori che ho trovato una soluzione, forse non è il migliore o più efficiente, ma ... IT LAVORI! (Testato su IE9, Firefox 12, Chrome 18)
Prima di tutto ho creato due metodi addEvent() e removeEvent() tra browser e ausiliari. (Idea tratta dal codice sorgente di 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]);
}
}
Inoltre abbiamo bisogno di un qualche tipo di 'contenitore' per memorizzare gli eventi collegati agli elementi, in questo modo:
HELPERS.EVTS = {};
E infine i due callable ed esposto ai metodi degli utenti: La prossima uno per aggiungere un evento (evento) e associare questo evento a un metodo (gestore) per un elemento specifico (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;
}
Infine il metodo che non-allegare tutti gli eventi pre-attached (evento) per un elemento specifico (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;
}
Tra l'altro, di chiamare questa modalità è necessario effettuare le seguenti operazioni: Capture un DOM Node
var a = document.getElementById('some_id');
chiamate il metodo 'bindEvent()' con i parametri corrispondenti.
bindEvent('click',function(){alert('say hi');},a);
e di de-attaccarlo:
removeAllEvent('click',a);
Questo è tutto, spero possa essere utile per qualcuno un giorno.
Dove hai ottenuto 'bindEvent()'? Che cosa fa? – jfriend00
Stai chiedendo una risposta non basata su jQuery (ad esempio, plain javascript)? – jfriend00
@ jfriend00: vuole implementarlo da solo - es. hes non usa jQuery, ma chiede come fa jQuery. – prodigitalson