2012-03-19 24 views
113

Utworzono pole wyboru dynamicznie. Użyłem addEventListener do wywołania funkcji po kliknięciu pola wyboru, które działa w przeglądarce Google Chrome i Firefox, ale nie działa w przeglądarce Internet Explorer 8. To jest mój kod:addEventListener nie działa w IE8

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

setCheckedValues to mój program obsługi zdarzeń.

Odpowiedz

211

Spróbuj:

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

Aktualizacja :: Dla wersji Internet Explorer przed IE9, attachEvent metoda powinna być stosowana do rejestracji określonego słuchacza do EventTarget to nazywa się on, dla innych addEventListener powinny być stosowane.

+1

Opis tego, dlaczego powinno się z tego korzystać, poprawi odpowiedź. – dkris

+0

@dkris dodał krótki opis jako wyjaśnienie, mam nadzieję, że czyni to nieco jaśniejszym .. :) –

43

Musisz użyć wersji attachEvent w wersjach IE przed IE9. Wykryć, czy addEventListener jest zdefiniowany i używać attachEvent jeśli to nie jest:

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

Zauważ, że IE11 will remove attachEvent.

Zobacz także:

0

Jeśli używasz jQuery można napisać:

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

mayb łatwiej (i ma większą wydajność) jeśli zlecić obsługi zdarzeń do innego elementu, na przykład tabeli

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

}); 

w ten sposób będziesz miał tylko jedną obsługi zdarzeń, a to będzie działać również dla nowo dodanych elementów. To wymaga jQuery> = 1,7

inny sposób wykorzystywać delegata()

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

}); 
3

IE nie obsługuje addEventListener aż do wersji 9, więc trzeba użyć attachEvent, oto przykład:

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

Jest to również proste rozwiązanie dla crossbrowser:

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

Zamiast "kliknięcia" "może być dowolne zdarzenie oczywiście.

+0

+1, myślę, że to sprytne obejście! Trzeci argument addEventListener's jest opcjonalny, więc może to być dobre rozwiązanie i jest ładniejsze niż gałęzie if-else. Ale w tym przypadku '_checkbox' jest elementem docelowym, a nie' okienkiem'. :) Więc może mógłbyś stworzyć funkcję, w której celem zdarzenia jest inny argument. – Sk8erPeter

+0

Och, przegłosowałem za wcześnie ... :) Otrzymuję _ "TypeError: Illegal invocation" _ w Chrome, jeśli próbuję pseudonimu elementów eventowych wywołań 'addEventListener' - zobacz ten temat: http://stackoverflow.com/questions/1007340/javascript-function-aliasing-doesnt-seem-to-work. Tak więc dla obiektu 'window' działa poprawnie, ale nie działa dla innych węzłów wewnątrz dokumentu. W ten sposób Twoje sugerowane wygładzanie NIE jest poprawne w przypadku opisanym w oryginalnym pytaniu! Jakie byłoby twoje obejście? – Sk8erPeter

2

Można użyć funkcji poniżej addEvent(), aby dodać zdarzenia do większości rzeczy, ale należy pamiętać, że dla XMLHttpRequest if (el.attachEvent) zawiedzie w IE8, ponieważ nie obsługuje XMLHttpRequest.attachEvent() więc trzeba użyć XMLHttpRequest.onload = function() {} zamiast.

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

ja zdecydowaliśmy się na szybki PolyFill na podstawie powyższych odpowiedzi:

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

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

Oczywiście, jak to powyżej odpowiedzi nie gwarantuje, że window.attachEvent istnieje, które mogą lub nie mogą być problem.

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

o wiele lepiej jest pokazać, co oznacza kod lub dodać notatki. Dzięki – toha

Powiązane problemy