Necesito escribir un fragmento de código que adjunte un oyente al evento seleccionado, y que funcionará en cualquier navegador popular, en cualquier versión del mismo. Después de hacer algunas búsquedas salí con la siguiente función:Un método para adjuntar el detector de eventos, compatible con todos los principales navegadores web
function addListener(event, thefunction)
{
if(window.addEventListener)
{
//All browsers, except IE before version 9.
window.addEventListener(event, thefunction, false);
}
else if(window.attachEvent)
{
//IE before version 9.
window.attachEvent(event, thefunction);
}
}
Bastante simple y parece ser autoexplicativo.
Puede haber algún problema con el evento DOMContentLoaded
, ya que ninguna versión de IE (AFAIK) lo reconoce, y los desarrolladores están obligados a usar onreadystatechange
en su lugar. La solución de este problema también parece ser bastante sencilla, hasta que Internet Explorer 9. Había que escribir solamente una línea adicional en else if(window.attachEvent)
:
event = (event == 'DOMContentLoaded') ? 'onreadystatechange' : "on" + event;
Esta parte siempre fue despedido en cualquier versión de Internet Explorer y esta línea ha proporcionado un simple traducción del nombre del evento, por lo que siempre se usó el correcto.
Pero, ¿qué hay de Internet Explorer 9 (y superior)? En el que Microsoft decidió que caerá attachEvent
a favor de addEventListener
. Pero no cambió onreadystatechange
en DOMContentLoaded
.
no puedo usar encima de la línea de window.addEventListener
parte, porque esto reescribir DOMContentLoaded
en onreadystatechange
caso, incluso para otros navegadores y dejar allí, ya que utilizan DOMContentLoaded
.
Entonces, ¿la única manera de resolver este problema, es añadir la detección del navegador (tipo y versión) para window.addEventListener
parte y si detecta que el guión está tratando con IE 9 o superior, se volverá a escribir el nombre del evento de DOMContentLoaded
a onreadystatechange
(y complemente el nombre de otros eventos con on
, requerido para IE), y en el caso de otros navegadores, ¿no se cambiará el nombre del evento?
O tal vez estoy equivocado, porque como acabo de probar, ni DOMContentLoaded
ni onreadystatechange
están siendo disparados en mi IE 8 (el primero se dispara correctamente en FF/Chrome).
¿Y qué hay de la función .on()
de jQuery (o similar)? ¿Alguien sabe si admite la conexión entre navegadores de DOMContentLoaded
, por lo que puedo estar seguro de que este tipo específico de evento será detectado por mi script, sin importar en qué navegador o su versión estoy usando?
Gracias por su respuesta detallada. Como escribí al final de mi pregunta, me preguntaba por qué 'onreadystatechange' no funciona correctamente en mi IE 8. Pero desde que usé jQuery resolvió este problema y funciona bien en todos los navegadores probados, he elegido de esta manera y dejó de preguntarse! :] – trejder
IE <9 tiene muchos problemas de compatibilidad, lo verificaré en IE8. ¿Quiere decir que el código [de esta respuesta] (http://stackoverflow.com/a/5959237/1331430) no funciona en IE8? –
Acabo de probar 'onreadystatechange' con' attachEvent' en IE8, parece disparar al menos una vez en mi [fiddle] (http://jsfiddle.net/SnSXM/), pero se disparará dos veces cuando la página se cargue por primera vez (Lo probaré localmente). Afortunadamente jQuery lo cuida bien, tratando de entender que los errores de IE pueden consumir la cordura de uno muy fácilmente. ':)' –