2012-12-15 11 views
8

Mam plik javascript, który ustawia EventListener "kliknięcia" na każdym elemencie z tagiem <article>. Chcę uzyskać identyfikator klikniętego artykułu po uruchomieniu zdarzenia. Z jakiegoś powodu mój kod nic nie produkuje!JavaScript nasłuchiwanie zdarzeń na wielu elementach i uzyskanie ID celu

Moje javascript:

articles = document.getElementsByTagName('article'); 
articles.addEventListener('click',redirect(e),false); 
function redirect(e){ 
alert(e.target.id); 
} 

Dlaczego nie jest to działa? BTW moja konfiguracja artykułu jest w funkcji wywoływanej, gdy okno jest ładowane, i wiem, że działa na pewno, ponieważ ta funkcja ma inne rzeczy, które działają.


EDIT

więc naprawiłem mój kod tak, że będzie pętla i dodać słuchacza do każdego elementu artykułu, a teraz pojawia się okno ostrzeżenia ze nic w nim. Podczas próby wysłania e.target bez identyfikatora otrzymuję następujący komunikat dla każdego elementu:

[object HTMLHeadingElement] 

Wszelkie sugestie?


KOLEJNA EDYCJA

Mój obecny kod javascript:

function doFirst(){ 
articles = document.getElementsByTagName('article'); 
for (var i = 0; i < articles.length; i++) { 
    articles[i].addEventListener('click',redirect(articles[i]),false); 
} 
} 

function redirect(e){ 
alert(e.id); 
} 
window.addEventListener('load',doFirst,false); 

To pokazuje moje pola powiadomienie, gdy strona zakończeniu ładowania, nie biorąc pod uwagę, że nie kliknął cholerstwa : O

Odpowiedz

8

Nie przekazujesz obiektu artykułu do przekierowania jako parametru.

Spróbuj (EDIT):

articles = document.getElementsByTagName('article'); 
for (var i = 0; i < articles.length; i++) { 
    articles[i].addEventListener('click',redirect,false); 
} 
function redirect(ev){ 
    alert(ev.target.id); 
} 

Nadzieja, to rozwiąże problem.

+1

To pokazuje identyfikatory, ale zanim kliknę pozycję! Jak mogę to rozwiązać? – arielschon12

+0

@ arielschon12: Nie rozumiem, co chcesz powiedzieć? Mówisz, że pokazuje alert, nawet bez klikania elementu. To nie jest możliwe. –

+0

To właśnie się dzieje. W momencie załadowania strony pojawiają się pola alertów z identyfikatorami elementów. – arielschon12

3

Wykonujesz funkcję przekierowania zamiast przekazywania referencji, spróbuj tego:

articles = document.getElementsByTagName('article'); 
articles.addEventListener('click',redirect,false); 
function redirect(e){ 
    alert(e.target.id); 
} 

Edit: Również getElementsByTagName zwraca tablicę z artykułów, więc trzeba pętli przez nich i nazywają addEventListener na każdej z nich.

articles = document.getElementsByTagName('article'); 
for (var i = 0; i < articles.length; i++) { 
    articles[i].addEventListener('click',redirect,false); 
} 
function redirect(e){ 
    alert(e.target.id); 
} 
+0

nie jest działa również, wszelkie inne sugestie? – arielschon12

+0

Tak, brakowało mi faktu, że używasz getElementsByTagName. Zobacz moją edycję – sroes

+0

Nadal nie działa, pojawia się okno alertu, ale bez identyfikatora. Jest po prostu pusty. – arielschon12

2

getElementsByTagName zwraca nodelistę. Następnie możesz dodać listę zdarzeń do każdego z tych elementów za pomocą pętli for.

<div id="test"> 
hey 
</div> 
<div id="test2"> 
yo 
</div> 

<script> 
var nl = document.getElementsByTagName('div'); 

for(var i=0; i<nl.length; i++){ 
    nl[i].addEventListener('click', function(e){ 
     alert(e.target.id); 
    },false); 
} 
</script> 
+0

To bardzo pomogło, teraz widzę okienko alarmowe. Problem polega na tym, że pole ostrzeżenia jest puste. nie ma identyfikatora, gdy wiem, że moje elementy mają identyfikatory. Dlaczego? – arielschon12

+0

Jak wygląda twój html. – gkiely

+0

Mam tylko kilka artykułów rozrzuconych po okolicy, to nie jest ważna część. – arielschon12

-1
articles.addEventListener('click',redirect,false); // omit redirect(e) inside event listener // and then try with the alert as you did. 

jeśli nie działa spróbuj przez e.id zamiast e.target.id wewnątrz wpisu jak poniżej:

alert(this.id); 

Dzięki.

+0

podczas korzystania z e.id pojawia się komunikat "nieokreślony" – arielschon12

+0

Czy masz jakieś inne sugestie? – arielschon12

+0

test przy użyciu this.id zamiast e.id, dzięki. –

4

Dlaczego nikt nie wspomina o jednym zdarzeniu, które sprawdza kliknięty element?

document.body.addEventListener('click', function(e) { 
    var target = e.target; 
    if (target.nodeName === 'article') { 
     // do whatever you like ;-) 
    } 
    e.stopPropagation() 
}); 

to bardziej wydajnych mieć mniej zdarzeń ..

jeśli nie trzeba sprawdzać wydarzenia kliknij na całym ciele można dołączyć zdarzenie do jakiegoś bliżej elementu nadrzędnego

Powiązane problemy