dlaczego dostaję TypeError: obj.addEventListener nie jest funkcją?

Oto Mój kod:

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

Zasadniczo pracuję w konsoli firebug i staram się, aby alert pojawił się po kliknięciu dowolnego znacznika.

Nie widzę problemu, który powoduje, że to nie działa i daje mi błąd podany w tytule moich pytań(przeglądane w firebug). Ktokolwiek?

Author: Matt, 2013-03-18

3 answers

document.getElementsByTagName zwraca NodeList elementów DOM. Każdy element ma funkcję addEventListener, ale tablica jej nie ma.

Pętla nad nim:

function showWinner (){
    var aTags = document.getElementsByTagName("a");
    for (var i=0;i<aTags.length;i++){
        addEvent(aTags[i], 'click', alertWinner);
    }
}
 35
Author: Matt Zeunert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 09:17:39

aTag jest instancją DOMNodeList, a nie DOMElement.

Możesz to zrobić zamiast tego:
var aTags = document.getElementsByTagName("a");
var aTag = aTags[0];

Ale oczywiście to podejście przedstawia wadę, w tym, że może być więcej niż jeden a element zwrócony. Należy użyć innego selektora, który zwraca tylko jeden element, jeśli to możliwe.

 7
Author: Sebas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-13 08:07:21

Nie wiem dlaczego, ale mam addEvent is not defined w Firefoksie. Nie mogłem nawet znaleźć addEvent() na MDN. Musiałem tego użyć:

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);
    }
}
 4
Author: Jason Lydon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-25 04:37:45