2008-09-30 5 views
7

IE6/7에서 NodeList가 정의되지 않은 이유는 무엇입니까?개체가 IE에서 NodeList의 인스턴스인지 확인하는 방법은 무엇입니까?

<form action="/" method="post" id="testform"> 
    <input type="checkbox" name="foobar[]" value="1" id="" /> 
    <input type="checkbox" name="foobar[]" value="2" id="" /> 
    <input type="checkbox" name="foobar[]" value="3" id="" />  
</form> 

<script type="text/javascript" charset="utf-8"> 
(function() { 
    var el = document.getElementById('testform')['foobar[]'] 
    if (el instanceof NodeList) { 
     alert("I'm a NodeList"); 
    } 
})(); 
</script> 

이것은 FF3/Safari 3.1에서는 작동하지만 IE6/7에서는 작동하지 않습니다. 누구든지 모든 브라우저에서 el이 NodeList의 인스턴스인지 확인하는 방법에 대한 아이디어가 있습니까?

답변

0

나는 항상 특정 유형으로 평가되는 것을 사용합니다. 그런 다음 유효한 객체인지 여부를 확인하기 위해 참/거짓 유형 검사를 수행합니다. 귀하의 경우 지금처럼 선택 항목에 대한 참조를 얻은 다음 getOptions() 메서드를 사용하여 옵션을 나타내는 HTMLCollection을 가져옵니다. 이 객체 유형은 NodeList와 매우 유사하므로 아무런 문제없이 작업해야합니다.

15

"Duck Typing는"항상 작동합니다 :

... 

if (typeof el.length == 'number' 
    && typeof el.item == 'function' 
    && typeof el.nextNode == 'function' 
    && typeof el.reset == 'function') 
{ 
    alert("I'm a NodeList"); 
} 
+5

나는 이것을 (매우 해킹 된) 투표하려고했으나 더 많은 조사를 한 후에 IE에서이 방법을 사용하는 것으로 보입니다. +1. –

0

jQuery를으로 :

if (1 < $(el).length) { 
    alert("I'm a NodeList"); 
} 
4

아담 프랑코의 대답 거의 작품. 유감스럽게도 typeof el.item은 다른 버전의 IE (7 : string, 8 : object, 9 : function)에서 서로 다른 결과를 반환합니다. 그래서 코드를 사용하고 있지만 라인을 으로 변경하고 =====으로 변경했습니다.

if (typeof el.length === 'number' 
    && typeof el.item !== 'undefined' 
    && typeof el.nextNode === 'function' 
    && typeof el.reset === 'function') 
{ 
    alert("I'm a NodeList"); 
} 
+0

나는 조금 늦었다 :-). 여기에'==='와'=='사이에는 차이가 없으며,'==='에 대한 여분의 문자는 절대 없습니다. * nextNode * 및 * reset * 속성은 [NodeList] (http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID)에 대한 W3C DOM Core 3 사양의 일부가 아닙니다. -536297177) 특히 좋은 테스트는 아닙니다. – RobG

+0

'==='와'=='에는 차이가 있습니다. 전자는 약간 빠르지 만 두 값을 같은 유형 인 것처럼 비교합니다. 동일한 유형이 아닌 경우 (즉, 둘 다 문자열이 아닌 경우) false를 반환합니다. 이는 특히 위선적 인 가치를 다룰 때 매우 중요합니다. 변수'x'가 다른 코드에 의해 부울 값'false'가 할당되었다고 가정하지만 실제로는 아직 정의되지 않은 경우'x == null'과'x == false'는 true를 반환합니다. 그렇지 않아. – craigpatik

+4

"여기"라는 단어를 놓쳤습니다. * typeof *는 다른 문자열과 비교되는 문자열을 반환합니다. [추상 평등 비교 알고리즘] (http://es5.github.com/#x11.9.3)과 [완전 동등 비교 알고리즘] (http://es5.github.com/#x11. 9.6)은 유형을 비교하는 것입니다. 유형이 동일한 경우 비교의 나머지는 동일합니다. 이 경우 ** 다른 사람보다 더 빠를 이유는 없습니다. **. * nextNode * 및 * reset * 테스트의 잘못된 음수에 만족한다고 생각하십니까? – RobG

관련 문제