JavaScript – Pegadinha no getElementById
Postado por: Jeronimo Fagundes emClaramente inspirei o título deste post no outro escrito pelo colega Luiz Paulo. O problema do getElementById no Internet Explorer já é bem conhecido, mas posto aqui, pois muita gente ainda não deve saber.
Como sabemos, a função document.getElementById retorna um elemento da página cujo id é passado como parâmetro. Contudo, o Internet Explorer (até a versão 7) tem uma implementação dessa função um tanto, digamos, controversa.
Na execução dessa função, o IE procura não só por elementos cujo id seja igual ao passado por parâmetro, mas também considera os elementos cujo name seja igual àquele id.
Por exemplo, se temos o seguinte elemento:
<input name="login" type="text" />
e tentamos buscá-lo com getElementById:
var meu_campo = document.getElementById("login");
No Internet Explorer será retornado o campo de texto, mas no Firefox, por exemplo, não. Todavia, o correto é realmente não retornar, pois o campo de texto não possui atributo id definido. O nome da função é getElementById, e não getElementByIdOrName. Além disso, é o que define a recomendação do W3C.
A Microsoft se defendia, dizendo que, segundo o W3C, id e name compartilham do mesmo namespace (eles ignoraram a parte em que diz que isto é apenas para âncoras (tag a), mas tudo bem, vamos dar esse desconto). Ou seja, segundo a MS, se houvesse um elemento com id igual ao passado por parâmetro, seria o mesmo cujo name fosse igual àquele id. Mas eles não admitem ter ignorado a recomendação do próprio W3C que diz que a função getElementById deve retornar o elemento cujo atributo id, e apenas o atributo id, seja igual àquele passado pelo programador como parâmetro.
Finalmente, eles admitiram o erro que perdurou por anos. A função foi corrigida no Internet Explorer 8. Mas atenção: se a página estiver no modo de compatibilidade, a função será executada como no IE7!
Então, para evitar problemas com versões anteriores a 8, não use dois elementos em que o name de um seja igual ao id do outro. Evita dor de cabeça com browsers mais antigos. Mas é bem possível que você encontre algo assim em algum código legado, então, fique atendo ao experimentar erros estranhos ao utilizar o getElementById no Internet Explorer.













Valeu pela informação, eu não conhecia este bug ainda.
E as bibliotecas tratam isso como? jQuery, Mootools, Prototype. Seria legal avançar esse estudo
Valeu!
@Rafael, estas bibliotecas citadas exitem justamente pare resolver estes e outros tipos de problema/bug/incompatibilidade entre os browsers..
Bom as bibliotecas já cuidam desta parte, mesmo assim é bom saber sobre esse pequeno grande problema !
Não conhecia esse “bug” não. Bom saber. =D
Mas a melhor parte é:
[quote]Finalmente, eles admitiram o erro que perdurou por anos. A função foi corrigida no Internet Explorer 8. [b]Mas atenção: se a página estiver no modo de compatibilidade, a função será executada como no IE7![/b][/quote]
hehehehe
Abraços.
Bela dica. Me deparei com este problema.
Com a sua dica, foi “facim facim” resolver.
Obrigado e Abraços…
É!!! isso é um bug um tanto quanto irritante!!
Uma vez peguei um código já desenvolvido por 3° e tinha este erro! Na realidade, acho que também é um erro do programador, mais tudo bem!!!
Demorei muito para conseguir encontrar o erro. Depois que instalei o firebug e o webdeveloper toolbar no meu Firefox, estes problemas pequenos ficaram de fácil identificação!!!
Abraços!!!
[...] this page was mentioned by Rafael de Almeida (@raffields), Pinceladas da Web (@pinceladasdaweb), Pinceladas da Web (@pinceladasdaweb) and others. [...]