2012-03-19 20 views
113

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

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

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

答えて

211

試してみてください。

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

更新::前IE9へのInternet Explorerのバージョンについて は、attachEvent方法は他人addEventListenerのために使用されるべきで、それが呼ばれEventTargetに指定されたリスナーを登録するために使用する必要があります。あなたが別の要素にイベント処理を委任する場合

+1

なぜこれを使用すべきかについての説明は、回答を改善するでしょう。 – dkris

+0

@dkrisは説明として短い説明を追加しました。私は物事を少し鮮明にすることを願っています。:) –

43

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

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

IE11 will remove attachEventこと。

も参照してください:あなたはjQueryのを使用している場合

0

はあなたが書くことができます。

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

Maybそれはあなたが唯一のイベントハンドラを持つことになり、これも動作しますあなたのテーブル例えば、このように

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

}); 

方が簡単です(と、より性能を有します)新しく追加された要素のために。

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

あなたがattachEventを使用する必要がありますので、IEは、バージョン9までaddEventListenerをサポートしていませんが、ここでは一例です)(そうでない場合は、デリゲートを使用してjQueryの> = 1.7

が必要です

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

代わりの「クリック:これは、単純なcrossbrowserソリューションです。もちろん、どんなイベントでもあります。

13

:これは

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

}); 
+0

+1、これはスマートな回避策だと思います! 'addEventListener'の3番目の引数はオプションですが、これは良い解決策になるかもしれませんし、if-else分岐よりも良いです。しかしこの場合、 '_checkbox'は' window'ではなくtarget要素です。 :)多分あなたはイベントターゲットが別の引数である関数を作成することができます。 – Sk8erPeter

+0

ああ、あまりにも早くupvoted ... :)イベントターゲット要素の '' addEventListener'呼び出しをエイリアスしようとすると、Chromeで_ "TypeError:Illegal invocation" _が発生する - このトピックを参照してください:http://stackoverflow.com/questions/1007340/javascript-function-aliasing-does-seem-to-work。したがって、 'window'オブジェクトの場合、正しく動作しますが、ドキュメント内の他のノードでは機能しません。この方法では、元の質問に記載されているケースに対して、推奨されるエイリアシングが正しくありません!あなたの回避策は何ですか? – Sk8erPeter

2

それはあなたの代わりにXMLHttpRequest.onload = function() {}を使用する必要がありそうXMLHttpRequest.attachEvent()をサポートしていないので、IE8に失敗するあなたは、ほとんどのもののためにイベントを追加しますが、XMLHttpRequestのif (el.attachEvent)のためにそれを注意することがaddEvent下記()関数を使用することができます。

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

私は上記の回答に基づいて迅速なポリフィルを選択しましたしました:window.attachEventが存在することを保証するものではない。もちろん、

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

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

、この上記の回答のように、あるいはあってもなくてもよいです問題。

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

コードの意味を示したり、メモを追加したりする方がはるかに優れています。ありがとう – toha