addEventListener не працює в IE8


118

Я створив прапорець динамічно. Я використовував addEventListenerдля виклику функції при натисканні прапорця, яка працює в Google Chrome і Firefox, але не працює в Internet Explorer 8 . Це мій код:

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

setCheckedValues є моїм обробником подій.

Відповіді:


215

Спробуйте:

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

Оновлення :: Для версій Internet Explorer до IE9 слід застосувати метод attachEvent для реєстрації зазначеного слухача в EventTarget, на який він викликається, для інших слід використовувати addEventListener .


1
Опис того, чому це слід використовувати, покращить відповідь.
dkris

@dkris додав короткий опис як уточнення, я сподіваюся, що це робить дещо зрозуміліше .. :)
Sudhir Bastakoti

44

Ви повинні використовувати attachEventу версіях IE до IE9. Визначте, чи addEventListenerвизначено, і використовувати, attachEventякщо це не так:

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

Зауважте, що IE11 видалитьattachEvent .

Дивитися також:


13

Це також просте рішення для кроссбоузера:

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

Замість "натискання", звичайно, може бути будь-яка подія.


+1, я думаю, що це розумне рішення! addEventListenerТретій аргумент в будь-якому разі є необов’язковим, тому це може бути хорошим рішенням, і це приємніше, ніж гілки if-else. Але в цьому випадку _checkboxце цільовий елемент, а не window. :) Тож, можливо, ви можете створити функцію, де ціль події - ще один аргумент.
Sk8erPeter

Ой, я занадто рано оголосив про голосування ... :) Я отримую "TypeError: Незаконне виклик" в Chrome, якщо намагаюся дозволити addEventListenerвиклики цільових елементів події - див. Цю тему: stackoverflow.com/questions/1007340/… . Отже, для windowоб’єкта він працює правильно, але не працює для інших вузлів всередині документа. Таким чином, запропонований вами псевдонім НЕ правильний для випадку, згаданого в оригінальному запитанні! Яким було б ваше вирішення?
Sk8erPeter

3

IE не підтримує addEventListenerверсію 9, тому вам доведеться використовувати attachEventось такий приклад:

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

2

Mayb простіше (і має більшу ефективність), якщо ви делегуєте обробку події іншому елементу, наприклад, вашій таблиці

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

});

таким чином у вас буде лише один обробник подій, і це буде працювати і для нових доданих елементів. Для цього потрібен jQuery> = 1.7

В іншому випадку використовуйте delegate ()

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

});

2

Ви можете скористатися наведеною нижче функцією addEvent (), щоб додати події для більшості речей, але зауважте, що для XMLHttpRequest if (el.attachEvent)не вдасться в IE8, оскільки він не підтримує, XMLHttpRequest.attachEvent()тому вам доведеться використовувати XMLHttpRequest.onload = function() {}замість цього.

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

Я вибрав швидкий Polyfill на основі вищезазначених відповідей:

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

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

Звичайно, як і відповіді вище, це не гарантує window.attachEventіснування, що може бути, а може і не бути проблемою.


0

Якщо ви використовуєте jQuery, ви можете написати:

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

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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.