2011-03-02 4 views
2

좋아, 기본 document.getElementsByTagName 함수를 사용하려고하는데, 할 때마다 존재하지 않는 결과가 나타납니다. 즉, 정의되지 않은 nodeNames가있는 요소와 이와 같은 것들. 이로 인해 내 스크립트가 중단되고 나에게 문제가 발생합니다. 여기 (x 요소) 이상한 결과를위한 JavaScript

는 샘플입니다

이 HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
    <head> 
    <title></title> 
    </head> 
    <body> 
    <div></div> 
    <div></div> 
    <div></div> 
    </body> 
</html> 

이 스크립트

for(x in document.getElementsByTagName('div')) 
    alert(document.getElementsByTagName('div')[x].nodeName); 

DIV 
DIV 
DIV 
undefined 

다음 스크립트가 종료 생성합니다. (에 대한 사용하는 경우

그냥 다른 세부 사항을 요구

내가 문제를 찾을 수없는, 그리고 모든 브라우저에서이 같은 작품 ... ...

답변

4

정정하십시오 NodeList을 반환 getElementsByTagName, 숫자 인덱스와 length 속성이 있습니다, 따라서 그것에게 Array -like 객체 만들기.

그럼에도 불구하고, 당신은과 같이 간단한 for 루프를 사용한다 :

var els = document.getElementsByTagName('div'); 
for(var i = 0, j = els.length; i < j; i++) { 
    alert(els[i].nodeName); 

이유를 당신이 for..infor을 사용하려면하지 왜 여기 for..in이 반복되는 객체의 상속 된 속성을 사용하기 때문에, 그래서 피하기 위해 hasOwnProperty을 사용할 수는 있지만이 경우 숫자 인덱스를 반복하는 경우에만 및 hasOwnProperty을 사용하여 간단한 for 루프를 사용하는 것이 더 좋습니다.

+0

나는 당신이 말하고자하는 것을 이해하지만,'document.getElementsByTagName'는'Array'를 리턴하지 않는다는 것에주의하십시오. –

+0

@iwburk 업데이트되었습니다. 감사합니다. –

+3

'NodeList'는 배열과 같은 객체이므로, 원래의 명령문이 여전히 적용됩니다. 배열과 같은 객체에서'for..in'을 사용하면'length' 속성과 프로토 타입 체인에 정의 된 다른 모든 속성을 열거 할 수 있습니다. (현재 대답은 여전히 ​​괜찮습니다. 첫 번째 비트를 분명히하고 싶습니다.) – gonchuki

1

자바 스크립트 객체의 모든 속성을 반환). 상속 된 속성을 건너 뛸 .hasOwnProperty를 사용

var elems = documents.getElementsByTagName('div'); 
for (x in elems){ 
    if (elems.hasOwnProperty(x)) 
     alert(elems[x].nodeName); 
} 
+2

반환되는 컬렉션에는 고유 한 길이 속성이 있으며 열거 형으로 표시됩니다 (적어도 Chrome 10 이상). 'for' 루프가 아마도 더 적절할 것입니다. – user113716

+0

확실히 배열을 알고 있다면 (var i = 0; i