web-dev-qa-db-ja.com

IE8でaddEventListenerが機能しない

チェックボックスを動的に作成しました。 addEventListenerを使用して、チェックボックスのクリック時に関数を呼び出しました。これは、Google ChromeおよびFirefoxで機能しますが、Internet Explorer 8では機能しません。これは私のコードです:

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

setCheckedValuesは私のイベントハンドラです。

116
ravi404

試してください:

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

Update ::IE9より前のInternet Explorerバージョンでは、 attachEvent メソッドを使用して、指定されたリスナーを-に登録する必要があります EventTarget 呼び出されます。他の場合は addEventListener を使用する必要があります。

212

IE9より前のIEバージョンではattachEventを使用する必要があります。 addEventListenerが定義されているかどうかを検出し、定義されていない場合はattachEventを使用します。

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

IE11はattachEvent を削除することに注意してください。

こちらもご覧ください:

43
Zeta

これもシンプルなクロスブラウザソリューションです。

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

もちろん、「クリック」の代わりに任意のイベントを指定できます。

13

IEはバージョン9までaddEventListenerをサポートしていません。したがって、attachEventを使用する必要があります。以下に例を示します。

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

以下のaddEvent()関数を使用してほとんどのイベントを追加できますが、IE8ではXMLHttpRequestのif (el.attachEvent)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
Anon

上記の回答に基づいて、簡単なポリフィルを選択しました。

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

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

もちろん、上記の回答のように、これはwindow.attachEventが存在することを保証しません。これは問題である場合とそうでない場合があります。

2
Campbeln

たぶん、イベント処理をテーブルなどの別の要素に委任する方が簡単です(そしてパフォーマンスが向上します)

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

});

この方法では、イベントハンドラーは1つしかなく、これは新しく追加された要素に対しても機能します。これには1.7以上のjQueryが必要です

それ以外の場合は、delegate()を使用します

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

});
2
if (document.addEventListener) {
    document.addEventListener("click", attachEvent, false);
}
else {
    document.attachEvent("onclick", attachEvent);
}
function attachEvent(ev) {
    var target = ev.target || ev.srcElement;
    // custom code
}
0
Pramod Kumar

JQueryを使用する場合、次のように記述できます。

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