2011-03-23 13 views
30

tengo:¿Se pueden agregar múltiples detectores/manejadores de eventos al mismo elemento usando javascript?

if (window.addEventListener) { 
    window.addEventListener('load',videoPlayer,false); 
} 
else if (window.attachEvent) { 
    window.attachEvent('onload',videoPlayer); 
} 

y luego tengo:

if (window.addEventListener) { 
    window.addEventListener('load',somethingelse,false); 
} else if (window.attachEvent) { 
    window.attachEvent('onload',somethingelse); 
} 

¿Es preferible/funcional para tener a todos juntos? Como

if (window.addEventListener) { 
    window.addEventListener('load',videoPlayer,false); 
    window.addEventListener('load',somethingelse,false); 
} else if (window.attachEvent) { 
    window.attachEvent('onload',videoPlayer,false); 
    window.attachEvent('onload',somethingelse); 
} 
+0

Sé que es posible con jQuery. Si tiene una opción para usar. –

Respuesta

32

Puede hacer como quiera que lo haga. No tienen que estar juntos, depende del contexto del código. Por supuesto, si puede unirlos, entonces debería hacerlo, ya que esto probablemente haga que la estructura de su código sea más clara (en el sentido de "ahora estamos agregando todos los controladores de eventos").

Pero a veces tiene que agregar oyentes de eventos dinámicamente. Sin embargo, no es necesario probar varias veces si se trata de IE o no.

Mejor sería abstraer de esto y probar solo una vez qué método está disponible cuando se carga la página. Algo como esto:

var addEventListener = (function() { 
    if(document.addEventListener) { 
     return function(element, event, handler) { 
      element.addEventListener(event, handler, false); 
     }; 
    } 
    else { 
     return function(element, event, handler) { 
      element.attachEvent('on' + event, handler); 
     }; 
    } 
}()); 

Esto pondrá a prueba una vez el método a utilizar. A continuación, puede adjuntar eventos a lo largo de la secuencia de comandos con:

addEventListener(window, 'load',videoPlayer); 
addEventListener(window, 'load',somethingelse); 
+0

¿Por qué la función convolucionada-llamada-patrón inmediato aquí? No sería más simple 'if (document.addEventListener) {addEventListener = ...} else {addEventListener = ...}'? – 6502

+1

Solo una cuestión de estilo. Veo la prueba como algo que es completamente independiente del código circundante y me gusta mantenerlo en su propio "contenedor"/contexto. Pero tienes razón, en este caso no es necesario. –

+0

Para ser claros, adjuntarEvento es antiguo, ni siquiera debería usar IE :) para la orientación móvil ni siquiera preocuparse por la detección. –

5

utilizo esta función:

function addEvent (obj, type, fn) { 
    if (obj.addEventListener) { 

    obj.addEventListener(type, fn, false); 

    } else if (obj.attachEvent) { 

    obj.attachEvent('on' + type, function() { 

     return fn.call(obj, window.event); 

    }); 
    } 
} 
1
/** 
* multipleEventsListeners.js 
* Add the capability to attach multiple events to an element, just like jQuery does 
* https://gist.github.com/juanbrujo/a1f77db1e6f7cb17b42b 
*/ 

multipleEventsListeners(events, func, elem) { 
    elem = elem || document; 
    var event = events.split(' '); 
    for (var i = 0; i < event.length; i++) { 
    elem.addEventListener(event[i], func, false); 
    } 
} 

/* 
Use: 
var input = document.querySelector('input'); 
multipleEventsListeners(input, 'keyup change', function(e){ 
    console.log = this.value; 
}); 
*/ 

de: https://gist.github.com/juanbrujo/a1f77db1e6f7cb17b42b

Cuestiones relacionadas