2012-12-15 2 views
8

<article> 태그와 함께 모든 요소에 '클릭'의 EventListener를 설정하는 자바 스크립트 파일이 있습니다. 나는 이벤트가 발생했을 때 클릭 한 기사의 ID를 얻고 싶다. 웬일인지, 제 코드는 아무것도 생성하지 않습니다!자바 스크립트 클릭하면 여러 요소에 이벤트 리스너 및 대상 ID를

내 자바 스크립트 :

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

는 왜 작동하지? BTW 내 기사 설정은 윈도우가로드 될 때 호출되는 함수에 있으며, 그 함수는 다른 것들이 작동하기 때문에 확실히 작동한다는 것을 알고 있습니다. 이 루프하고 모든 문서 요소에 리스너를 추가 있도록


편집 그래서 난 내 코드를 고정하고, 지금은 거기에 아무것도 경고 상자를 얻을. 아이디없이 출력에 e.target을 시도 할 때, 나는 모든 요소에 대해 다음과 같은 메시지가 :

[object HTMLHeadingElement] 

어떤 제안?


ANOTHER 편집

나의 현재 자바 스크립트 코드 : 페이지가 난 빌어 먹을 일을 클릭하지 않았 음을 고려하지 않고,로드를 완료 할 때 내 경고 상자를 보여주고있다

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

: O

답변

8

기사 개체를 전달하여 매개 변수로 리디렉션하지 않습니다. 이 버그를 해결할 것입니다,

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

희망 :

이 ( EDIT)를보십시오.

+1

이것은 ID를 보여 주지만 아이템을 클릭하기도 전에! 어떻게 해결할 수 있을까요? – arielschon12

+0

@ arielschon12 : 나는 당신이 무엇을 말하려고하는지 알지 못했습니까? 당신은 요소를 클릭하지 않고도 경고를 표시한다고 말하고 있습니까? 불가능합니다. –

+0

정확히 무슨 일이 일어나고 있는지. 페이지가로드되는 순간 요소 아이디로 경고 상자가 나타납니다. – arielschon12

3

참조를 전달하는 대신 리디렉션 함수를 실행하고 있습니다.

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

편집 : 당신이 그들을 통해 루프 가지고 그들의 각 하나에 또는 addEventListener를 호출 할 수 있도록는 또한, getElementsByTagName은, 기사와 배열을 반환 .

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

아닌가요 일부 가까이 부모 요소에 이벤트를 첨부 할 수

.. 작은 이벤트를 더 확대됨에의 다른 제안도하고 있습니까? – arielschon12

+0

그래, 나는 당신이 getElementsByTagName을 사용하고 있다는 사실을 놓쳤다. 내 편집을 참조하십시오 – sroes

+0

아직도 작동하지 않습니다, 나는 경고 상자하지만 ID없이. 그것은 단순히 비어 있습니다. – arielschon12

2

getElementsByTagName은 노드 목록을 반환합니다. 그런 다음 for 루프를 사용하여 각 요소에 eventlistener를 추가 할 수 있습니다.

<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

이것은 많은 도움이되었습니다. 이제 경고 상자가 나타납니다. 문제는 경고 상자가 비어 있습니다. 내 요소에 ID가있는 경우 ID가 없습니다. 왜 그런가요? – arielschon12

+0

귀하의 HTML은 어떤 모습입니까? – gkiely

+0

나는 방금 흩어져있는 많은 기사들을 가지고있다. 그것은 중요한 부분이 아니다. – arielschon12

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

다음 작업을 다음과 같이 경고 내부 e.id 대신 e.target.id에 의해 시도하지 않는 경우

alert(this.id); 

감사합니다.

+0

e.id를 사용할 때 "정의되지 않은"메시지가 표시됩니다. – arielschon12

+0

다른 제안이 있으십니까? – arielschon12

+0

e.id 대신 this.id를 사용하여 테스트합니다. 감사합니다. –

4

아무도 클릭 된 요소를 확인하는 단일 이벤트를 언급하지 않는 이유는 무엇입니까?

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

당신이 몸 전체에 클릭 이벤트를 확인할 필요가없는 경우

관련 문제