2012-03-19 21 views
113

Ho creato una casella di controllo in modo dinamico. Ho usato addEventListener per chiamare una funzione al clic della casella di controllo, che funziona in Google Chrome e Firefox ma non funziona in Internet Explorer 8. Questo è il mio codice:addEventListener non funziona in IE8

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

setCheckedValues è il mio gestore di eventi.

risposta

211

Prova:

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

aggiornamento :: Per le versioni di Internet Explorer precedenti alla IE9, attachEvent metodo deve essere utilizzato per registrare il listener specificato alla EventTarget si chiama via, per altri addEventListener dovrebbe essere usato.

+1

Una descrizione del motivo per cui questo dovrebbe essere utilizzato migliorerà la risposta. – dkris

+0

@dkris ha aggiunto una breve descrizione come chiarimento, spero che renda le cose un po 'più chiare .. :) –

43

È necessario utilizzare attachEvent in versioni IE precedenti a IE9. Rilevare se addEventListener è definito e utilizzare attachEvent se non lo è:

if(_checkbox.addEventListener) 
    _checkbox.addEventListener("click",setCheckedValues,false); 
else 
    _checkbox.attachEvent("onclick",setCheckedValues); 
//       ^^ -- onclick, not click 

noti che IE11 will remove attachEvent.

Consulta anche:

0

Se si utilizza jQuery si può scrivere:

$(_checkbox).click(function(e){ /*process event here*/ }) 
2

Mayb è più facile (e ha più prestazioni) se delegare la gestione degli eventi ad un altro elemento, per esempio il vostro tavolo

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

}); 

in questo modo si avrà solo un gestore di eventi, e questo funzionerà anche per gli elementi aggiunti di recente. Ciò richiede jQuery> = 1.7

Altrimenti utilizzare delegato()

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

}); 
3

IE non supporta addEventListener fino alla versione 9, quindi bisogna usare attachEvent, ecco un esempio:

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

Questa è anche una semplice soluzione crossbrowser:

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

Invece di fare clic 'può essere qualsiasi evento, naturalmente.

+0

+1, penso che questa sia una soluzione intelligente! Il terzo argomento di 'addEventListener' è facoltativo in ogni caso, quindi questa può essere una buona soluzione, ed è più bella dei rami if-else. Ma in questo caso, '_checkbox' è l'elemento di destinazione, non' window'. :) Quindi forse potresti creare una funzione in cui il target dell'evento è un altro argomento. – Sk8erPeter

+0

Oh, ho upvoted troppo presto ... :) Ottengo un _ "TypeError: Illegal invocation" _ in Chrome se provo ad alias le chiamate degli elementi di destinazione 'addEventListener' dell'evento - vedi questo argomento: http://stackoverflow.com/domande/1007340/javascript-funzione-aliasing-doesnt-sembra-to-work. Quindi, per l'oggetto 'window', funziona correttamente, ma non funziona per altri nodi all'interno del documento. In questo modo il tuo aliasing suggerito NON è corretto per il caso menzionato nella domanda originale! Quale sarebbe la tua soluzione? – Sk8erPeter

2

È possibile utilizzare la funzione di sotto addEvent() per aggiungere eventi per la maggior parte delle cose, ma di notare che per XMLHttpRequest if (el.attachEvent) fallirà in IE8, perché non sostenere XMLHttpRequest.attachEvent() quindi bisogna usare XMLHttpRequest.onload = function() {} invece.

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) { 
} 
2

ho optato per un Polyfill rapida basata sulle risposte di cui sopra:

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

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

Naturalmente, come le risposte di cui sopra questo non garantisce che window.attachEvent esiste, che può essere o non essere un problema.

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 
} 
+3

è molto meglio mostrare il significato del codice o aggiungere alcune note. Grazie – toha

Problemi correlati