2013-03-18 76 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控制檯的工作,並試圖得到一個警報被點擊任何一個標籤時彈出。

我無法看到導致此問題無法正常工作的問題,並給出了我的問題標題(在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 2013-03-18 19:20:05

+0

@VisioN你說得對,已經更新了我的答案。 – 2013-03-18 19:21:17

+0

這似乎應該工作,但我現在得到:referrenceError:aTags沒有定義。 – max7 2013-03-18 19:24:17

7

aTagDOMNodeList一個實例,而不是從DOMElement

你可以這樣做,而不是:

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

但很明顯這種方法存在一個缺陷,在可能有不止一個a元素返回。如果可能,您應該使用不同的選擇器,只返回一個元素。

+0

是的,把它修好了,謝謝 – Sebas 2013-03-18 19:20:34

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 2015-10-04 18:26:12

相關問題