addEventListener no funciona en IE8

118

He creado una casilla de verificación de forma dinámica. Solía addEventListenerllamar a una función al hacer clic en la casilla de verificación, que funciona en Google Chrome y Firefox pero no en Internet Explorer 8 . Este es mi codigo:

var _checkbox = document.createElement("input");
_checkbox.addEventListener("click", setCheckedValues, false);

setCheckedValues es mi controlador de eventos.

ravi404
fuente

Respuestas:

215

Tratar:

if (_checkbox.addEventListener) {
    _checkbox.addEventListener("click", setCheckedValues, false);
}
else {
    _checkbox.attachEvent("onclick", setCheckedValues);
}

Actualización :: Para las versiones de Internet Explorer anteriores a IE9, se debe usar el método attachEvent para registrar el oyente especificado en el EventTarget en el que se llama, para otras, se debe usar addEventListener .

Sudhir Bastakoti
fuente
1
Una descripción de por qué debe usarse esto mejorará la respuesta.
dkris
@dkris agregó una breve descripción como aclaración, espero que eso aclare un poco las cosas .. :)
Sudhir Bastakoti
13

Esta también es una solución simple para navegadores cruzados:

var addEvent =  window.attachEvent||window.addEventListener;
var event = window.attachEvent ? 'onclick' : 'click';
addEvent(event, function(){
    alert('Hello!')
});

En lugar de 'clic' puede ser cualquier evento, por supuesto.

Sergey Onishchenko
fuente
+1, creo que esta es una solución inteligente. addEventListenerEl tercer argumento es opcional de todos modos, por lo que esta puede ser una buena solución, y es mejor que las ramas if-else. Pero en este caso, _checkboxes el elemento objetivo, no window. :) Entonces, tal vez podría crear una función donde el objetivo del evento sea otro argumento.
Sk8erPeter
Oh, voté a favor demasiado pronto ... :) Recibo un "TypeError: Illegal invocation" en Chrome si intento crear un alias en las addEventListenerllamadas de los elementos de destino del evento ; consulte este tema: stackoverflow.com/questions/1007340/… . Entonces, para el windowobjeto, funciona correctamente, pero no para otros nodos dentro del documento. De esta manera, el alias que sugiere NO es correcto para el caso mencionado en la pregunta original. ¿Cuál sería su solución?
Sk8erPeter
3

IE no es compatible addEventListenerhasta la versión 9, por lo que debe usar attachEvent, aquí hay un ejemplo:

if (!someElement.addEventListener) {
    _checkbox.attachEvent("onclick", setCheckedValues);
}
else {
    _checkbox.addEventListener("click", setCheckedValues, false);
}
Adriano Repetti
fuente
2

Puede que sea más fácil (y tenga más rendimiento) si delega el manejo de eventos a otro elemento, por ejemplo, su tabla

$('idOfYourTable').on("click", "input:checkbox", function(){

});

de esta manera, solo tendrá un controlador de eventos, y esto también funcionará para los elementos recién agregados. Esto requiere jQuery> = 1.7

De lo contrario, use delegate ()

$('idOfYourTable').delegate("input:checkbox", "click", function(){

});
Nicola Peluchetti
fuente
2

Puede usar la función addEvent () a continuación para agregar eventos para la mayoría de las cosas, pero tenga en cuenta que para XMLHttpRequest if (el.attachEvent)fallará en IE8, porque no es compatible, XMLHttpRequest.attachEvent()por lo que debe usar XMLHttpRequest.onload = function() {}en su lugar.

function addEvent(el, e, f) {
    if (el.attachEvent) {
        return el.attachEvent('on'+e, f);
    }
    else {
        return el.addEventListener(e, f, false);
    }
}

var ajax = new XMLHttpRequest();
ajax.onload = function(e) {
}
Luego
fuente
2

Opté por un Polyfill rápido basado en las respuestas anteriores:

//# Polyfill
window.addEventListener = window.addEventListener || function (e, f) { window.attachEvent('on' + e, f); };

//# Standard usage
window.addEventListener("message", function(){ /*...*/ }, false);

Por supuesto, al igual que las respuestas anteriores, esto no garantiza que window.attachEventexista, lo que puede ser un problema o no.

Campbeln
fuente
0

Si usa jQuery puede escribir:

$( _checkbox ).click( function( e ){ /*process event here*/ } )
philipp
fuente
0
if (document.addEventListener) {
    document.addEventListener("click", attachEvent, false);
}
else {
    document.attachEvent("onclick", attachEvent);
}
function attachEvent(ev) {
    var target = ev.target || ev.srcElement;
    // custom code
}
Pramod Kumar
fuente