21

这是我的代码:

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();

基本上,我在萤火虫控制台中工作,并试图在单击任何标签时弹出警报。

我看不到导致这不起作用的问题,并给了我问题标题中所述的错误(在萤火虫中查看)。有人吗?

4

3 回答 3

37

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);
    }
}
于 2013-03-18T19:18:34.383 回答
7

aTag是 的一个实例DOMNodeList,而不是来自DOMElement

你可以这样做:

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

但显然这种方法存在一个缺陷,即可能返回多个a元素。如果可能,您应该使用仅返回一个元素的不同选择器。

于 2013-03-18T19:18:44.753 回答
4

不知道为什么,但我进入addEvent is not defined了 Firefox。addEvent()我什至在 MDN 上都找不到。我不得不使用这个:

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);
    }
}
于 2014-05-25T04:37:45.313 回答