2013-03-18 9 views
19

は、ここに私のコードです:なぜ私はTypeErrorを取得していますか?obj.addEventListenerは関数ではありませんか?

function addEvent(obj, type, fn) { 
    if (obj.attachEvent) { 
    obj['e'+type+fn] = fn; 
    obj[type+fn] = function(){obj['e'+type+fn](window.event);} 
    obj.attachEvent('on'+type, obj[type+fn]); 
    } else 
    obj.addEventListener(type, fn, false); 
} 

function alertWinner(){ 
    alert("You may be a winner!"); 
} 

function showWinner(){ 
    var aTag = document.getElementsByTagName("a"); 
    addEvent(aTag, 'click', alertWinner); 
} 

showWinner(); 

基本的に、私は放火犯のコンソールで作業し、任意のタグをクリックしたときにポップアップするアラートを取得しようとしています。

この問題が発生し、私の質問タイトル(firebugで表示)にエラーが表示されることはありません。誰ですか?

答えて

35

document.getElementsByTagNameは、DOM要素のNodeListを返します。各要素にはaddEventListener関数がありますが、配列には機能がありません。その上

ループ:

function showWinner(){ 
    var aTags = document.getElementsByTagName("a"); 
    for (var i=0;i<aTags.length;i++){ 
     addEvent(aTags[i], 'click', alertWinner); 
    } 
} 
+4

これは配列ではなく、NodeListです。 – VisioN

+0

@ VisioNあなたは正しいです、私の答えを更新しました。 –

+0

これはうまくいくはずですが、私は今、次のようになっています:referrenceError:aTagsは定義されていません。 – max7

7

aTagはないDOMElementから、DOMNodeListのインスタンスです。

あなたは代わりにこれを行うことができます:

var aTags = document.getElementsByTagName("a"); 
var aTag = aTags[0]; 

をしかし、複数のa要素が返さあるかもしれないという点で、明らかに、このアプローチは、欠陥を提示します。可能であれば、1つの要素だけを返す別のセレクタを使用する必要があります。

+0

はい、修正されました。 – Sebas

3

理由はわかりませんが、FirefoxではaddEvent is not definedとなっています。 MDNでaddEvent()が見つかりませんでした。私はこれを使用しなければならなかった:

function showWinner(){ 
    var aTags = document.getElementsByTagName("a"); 
    for (var i=0;i<aTags.length;i++){ 
     // addEvent(aTags[i], 'click', alertWinner); 
     aTags[i].addEventListener("click", alertWinner); 
    } 
} 
+0

これはaddeventが存在しないためです:) – Sebas

関連する問題