JavaScript – Pegadinha no getElementById

Postado por: Jeronimo Fagundes em

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

Posts Relacionados

Confira também outros artigos interessantes postados aqui no blog.

Gostou desse post?

Assine o nosso Feed RSS, siga-nos no Twitter, ou simplesmente nos recomende a seus amigos!

Sobre Jeronimo Fagundes

Jerônimo Fagundes da Silva é desenvolvedor web, mora em Porto Alegre e é Bacharel em Ciência da Computação pela UFRGS. Atualmente, é desenvolvedor de aplicativos web na DATACOM Telemática.

Central Server

8 Responses to “JavaScript – Pegadinha no getElementById”

  1. 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!

  2. Alexsandro disse:

    @Rafael, estas bibliotecas citadas exitem justamente pare resolver estes e outros tipos de problema/bug/incompatibilidade entre os browsers..

  3. Wellington disse:

    Bom as bibliotecas já cuidam desta parte, mesmo assim é bom saber sobre esse pequeno grande problema !

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

  5. Ivan R. Martins disse:

    Bela dica. Me deparei com este problema.
    Com a sua dica, foi “facim facim” resolver.

    Obrigado e Abraços…

  6. É!!! 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!!!

  7. [...] this page was mentioned by Rafael de Almeida (@raffields), Pinceladas da Web (@pinceladasdaweb), Pinceladas da Web (@pinceladasdaweb) and others. [...]

  8. muito bom este artigo parabens…tenho isso em meu site viconcursos agora uso muito jquery pra facilitar…

Leave a Reply