Finalmente, y después de horas de prueba & errores que he encontrado una solución, tal vez no es la mejor o más eficiente, pero ... TI ¡TRABAJOS! (Probado en IE9, Firefox 12, Chrome 18)
En primer lugar, creo dos métodos cross-browser y auxiliary addEvent() y removeEvent(). (Idea tomada del código fuente de 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]);
}
}
También necesitamos una especie de 'contenedor' para almacenar los eventos asociado a los elementos, así:
HELPERS.EVTS = {};
Y por último los dos exigible y expuesto a los métodos de los usuarios: El siguiente uno para agregar un evento (evento) y asociar este evento a un método (controlador) para un elemento específico (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;
}
Por último, el método que ONU-adjuntar todos los eventos pre-adjunta (eventos) para un elemento específico (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;
}
Por cierto, para llamar a estos métodos que usted debe hacer lo siguiente: Capture un DOM nodo
var a = document.getElementById('some_id');
Call el método 'bindEvent()' con los parámetros correspondientes.
bindEvent('click',function(){alert('say hi');},a);
Y para de-adjuntarlo:
removeAllEvent('click',a);
Eso es todo, esperamos que sea útil para alguien un día.
¿De dónde sacaste 'bindEvent()'? ¿Qué hace? – jfriend00
¿Está solicitando una respuesta que no esté basada en jQuery (por ejemplo, javascript simple)? – jfriend00
@ jfriend00: quiere implementarlo solo, por ej. no está usando jQuery, pero pregunta cómo lo hace jQuery. – prodigitalson