Pergunta

Por que é NodeList indefinido no IE6 / 7?

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

Isso funciona no FF3 / Safari 3.1, mas não funciona no IE6 / 7. Alguém tem alguma idéia como verificar se el é uma instância de NodeList em todos os navegadores?

Nenhuma solução correta

Outras dicas

" Duck Typing " deve sempre trabalhar:

...

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

A resposta de Adam Franco quase funciona. Infelizmente, typeof el.item retorna coisas diferentes em versão diferente do IE (7: String, 8: objeto, 9: função). Então, eu estou usando seu código, mas eu mudei a linha para typeof el.item !== "undefined" e mudou == para === todo.

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

Gostaria apenas de usar algo que sempre avalia a um certo tipo. Então você acabou de fazer uma verdadeira verificação de tipo / false para ver se você tem um objeto válido. No seu caso, gostaria de obter uma referência para o item selecione como você está agora, e então usar seus getOptions () para obter uma HTMLCollection que representa as opções. Este tipo de objeto é muito semelhante a um NodeList, para que você não deve ter nenhum problema em trabalhar com ele.

Com jQuery :

if (1 < $(el).length) {
    alert("I'm a NodeList");
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top