Wyrażenia lubią Element.getAttribute("id")
i Element.id
zwracają to samo.
Którego należy użyć, gdy potrzebujemy atrybutów obiektu HTMLElement?
Czy jest jakiś problem między przeglądarkami w przypadku tych metod, takich jak getAttribute()
i setAttribute()
?
Albo jakikolwiek wpływ na wydajność między bezpośrednim dostępem do właściwości obiektu a używaniem tych metod atrybutów?
javascript
html
dom
PK
źródło
źródło
Odpowiedzi:
getAttribute
pobiera atrybut elementu DOM, podczas gdyel.id
pobiera właściwość tego elementu DOM. One nie są takie same.W większości przypadków właściwości DOM są synchronizowane z atrybutami.
Jednak synchronizacja nie gwarantuje tej samej wartości . Klasycznym przykładem jest pomiędzy
el.href
iel.getAttribute('href')
dla elementu kotwicy.Na przykład:
<a href="/" id="hey"></a> <script> var a = document.getElementById('hey') a.getAttribute('href') // "/" a.href // Full URL except for IE that keeps '/' </script>
Dzieje się tak, ponieważ zgodnie z W3C właściwość href musi być poprawnie sformułowanym łączem. Większość przeglądarek przestrzega tego standardu (zgadnij, kto tego nie robi?).
Jest to kolejny przypadek w
input
„schecked
nieruchomości. Właściwość DOM zwracatrue
lub,false
podczas gdy atrybut zwraca ciąg"checked"
lub pusty ciąg.Następnie są pewne właściwości, które są synchronizowane tylko w jedną stronę . Najlepszym przykładem jest
value
własnośćinput
elementu. Zmiana jego wartości przez właściwość DOM nie zmieni atrybutu (edytuj: sprawdź pierwszy komentarz, aby uzyskać większą precyzję).Z tych powodów sugerowałbym dalsze używanie właściwości DOM , a nie atrybutów, ponieważ ich zachowanie jest różne w różnych przeglądarkach.
W rzeczywistości istnieją tylko dwa przypadki, w których musisz użyć atrybutów:
value
danegoinput
elementu).Jeśli chcesz uzyskać bardziej szczegółowe wyjaśnienie, zdecydowanie sugeruję przeczytanie tej strony . Zajmie Ci to tylko kilka minut, ale będziesz zachwycony informacjami (które tutaj podsumowałem).
źródło
value
niewielka : właściwość wejścia pobiera swoją początkową wartość z atrybutu, ale poza tym nie jest w ogóle z nim związana.value
Atrybut jest w pełni zsynchronizowane zamiast zdefaultValue
nieruchomości. Podobniechecked
idefaultChecked
. Z wyjątkiem starego IE (<= 7 i późniejszych trybów zgodności), który zepsułgetAttribute()
isetAttribute()
.a.href
zwraca pełny adres URL,a.getAttribute("href")
zwraca atrybut dokładnie tak, jak defiend w źródle HTML.input.formAction
) Lub pusty ciąg znaków (np.a.download
), Co powoduje, że są niejednoznaczne. Jedynym wyjątkiem są wartości, które nie są synchronizowane dwukierunkowo, takie jakvalue
.getAttribute('attribute')
zwykle zwraca wartość atrybutu jako ciąg znaków, dokładnie tak, jak zdefiniowano w źródle HTML strony.Jednak
element.attribute
może zwrócić znormalizowaną lub obliczoną wartość atrybutu. Przykłady:<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>
źródło
Zgodnie z tym testem jsPerf
getAttribute
jest wolniejszy niżid
właściwość.PS
Co dziwne, obie instrukcje działają bardzo źle w IE8 (w porównaniu z innymi przeglądarkami).
źródło
Zawsze używaj właściwości, chyba że masz konkretny powód, aby tego nie robić.
getAttribute()
isetAttribute()
są zepsute w starszym IE (i tryb zgodności w nowszych wersjach)Jest kilka wyjątków :
<form>
elementówO tym temacie pisałem kilka razy na SO:
źródło
.id
zapisuje narzut wywołania funkcji. (co jest bardzo małe, ale pytałeś.)źródło
Wypróbuj poniższy przykład, aby całkowicie to zrozumieć. Dla poniższego DIV
<div class="myclass"></div>
Element.getAttribute('class')
Powrócimyclass
ale trzeba użyćElement.className
który pobiera go od nieruchomości DOM.źródło
Jednym z obszarów, w którym ma to duże znaczenie, jest stylizacja CSS oparta na atrybutach.
Rozważ następujące:
const divs = document.querySelectorAll('div'); divs[1].custom = true; divs[2].setAttribute('custom', true);
div { border: 1px solid; margin-bottom: 8px; } div[custom] { background: #36a; color: #fff; }
<div>A normal div</div> <div>A div with a custom property set directly.</div> <div>A div with a custom attribute set with `setAttribute`</div>
Element div z ustawioną bezpośrednio właściwością niestandardową nie odzwierciedla wartości atrybutu i nie jest wybierany przez nasz selektor atrybutu (
div[custom]
) w css.Jednak element div z atrybutem niestandardowym ustawionym za pomocą
setAttribute
można wybrać za pomocą selektora atrybutu css i odpowiednio nadać mu styl.źródło