As expressões gostam Element.getAttribute("id")
e Element.id
retornam a mesma coisa.
Qual deve ser usado quando precisamos de atributos de um objeto HTMLElement?
Existe algum problema entre navegadores com esses métodos, como getAttribute()
e setAttribute()
?
Ou qualquer impacto no desempenho entre o acesso direto às propriedades do objeto e o uso desses métodos de atributos?
javascript
html
dom
PK
fonte
fonte
Respostas:
getAttribute
recupera o atributo de um elemento DOM, enquantoel.id
recupera a propriedade deste elemento DOM. Eles não são os mesmos.Na maioria das vezes, as propriedades DOM são sincronizadas com atributos.
Porém, a sincronização não garante o mesmo valor . Um exemplo clássico é entre
el.href
eel.getAttribute('href')
para um elemento âncora.Por exemplo:
Este comportamento ocorre porque de acordo com o W3C , a propriedade href deve ser um link bem formado. A maioria dos navegadores respeita esse padrão (adivinhe quem não?).
Há um outro caso para o
input
'schecked
propriedade. A propriedade DOM retornatrue
oufalse
enquanto o atributo retorna a string"checked"
ou uma string vazia.E então, existem algumas propriedades que são sincronizadas unilateralmente apenas . O melhor exemplo é a
value
propriedade de uminput
elemento. Alterar seu valor por meio da propriedade DOM não alterará o atributo (editar: verifique o primeiro comentário para obter mais precisão).Por esses motivos, sugiro que você continue usando as propriedades DOM , e não os atributos, pois seu comportamento difere entre os navegadores.
Na realidade, existem apenas dois casos em que você precisa usar os atributos:
value
de uminput
elemento).Se você quiser uma explicação mais detalhada, eu sugiro fortemente que você leia esta página . Demorará apenas alguns minutos, mas ficará encantado com as informações (que resumi aqui).
fonte
value
propriedade de uma entrada obtém seu valor inicial do atributo, mas de outra forma não está ligada a ele. Ovalue
atributo é totalmente sincronizado em vez dadefaultValue
propriedade. Da mesma formachecked
edefaultChecked
. Exceto no antigo IE (<= 7 e modos de compatibilidade posteriores), que quebrougetAttribute()
esetAttribute()
.a.href
retorna o URL completo,a.getAttribute("href")
retorna o atributo exatamente como defiend na fonte HTML.input.formAction
) ou string vazia (por exemploa.download
), o que torna as coisas ambíguas. A única exceção são os valores que não são sincronizados bidirecionais, comovalue
.getAttribute('attribute')
normalmente retorna o valor do atributo como uma string, exatamente como definido no código-fonte HTML da página.No entanto,
element.attribute
pode retornar um valor normalizado ou calculado do atributo. Exemplos:<a href="https://stackoverflow.com/foo"></a>
<input type="checkbox" checked>
<input type="checkbox" checked="bleh">
<img src='http://dummyimage.com/64x64/000/fff'>
<img src='http://dummyimage.com/64x64/000/fff' width="50%">
<img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
<div style='background: lime;'></div>
fonte
.id
salva a sobrecarga da chamada de função. (que é muito pequeno, mas você perguntou.)fonte
De acordo com este teste jsPerf
getAttribute
é mais lento do queid
propriedade.PS
Curiosamente, ambas as instruções têm um desempenho muito ruim no IE8 (em comparação com outros navegadores).
fonte
Sempre use as propriedades, a menos que tenha um motivo específico para não fazê-lo.
getAttribute()
esetAttribute()
estão quebrados no IE mais antigo (e modo de compatibilidade nas versões posteriores)Existem algumas exceções :
<form>
elementosJá escrevi sobre esse assunto algumas vezes no SO:
fonte
Experimente o exemplo abaixo para entender isso completamente. Para o DIV abaixo
<div class="myclass"></div>
O
Element.getAttribute('class')
retornará,myclass
mas você deve usar oElement.className
que o recupera da propriedade DOM.fonte
Uma área em que isso faz uma grande diferença é no estilo de CSS com base em atributos.
Considere o seguinte:
O div com a propriedade personalizada definida diretamente não reflete o valor do atributo e não é selecionado pelo nosso seletor de atributos (
div[custom]
) no css.O div com o atributo personalizado definido usando
setAttribute
, no entanto, pode ser selecionado usando um seletor de atributo css e estilizado de acordo.fonte