Ausdrücke mögen Element.getAttribute("id")
und Element.id
geben dasselbe zurück.
Welches sollte verwendet werden, wenn wir Attribute eines HTMLElement-Objekts benötigen?
Gibt es ein browserübergreifendes Problem mit diesen Methoden wie getAttribute()
und setAttribute()
?
Oder Auswirkungen auf die Leistung zwischen dem direkten Zugriff auf Objekteigenschaften und der Verwendung dieser Attributmethoden?
javascript
html
dom
PK
quelle
quelle
Antworten:
getAttribute
Ruft das Attribut eines DOM-Elements ab, währendel.id
die Eigenschaft dieses DOM-Elements abgerufen wird . Sie sind nicht gleich.Meistens werden DOM-Eigenschaften mit Attributen synchronisiert.
Die Synchronisation garantiert jedoch nicht den gleichen Wert . Ein klassisches Beispiel ist zwischen
el.href
undel.getAttribute('href')
für ein Ankerelement.Beispielsweise:
Dieses Verhalten tritt auf, weil laut W3C die Eigenschaft href eine wohlgeformte Verbindung sein muss. Die meisten Browser respektieren diesen Standard (raten Sie mal, wer nicht?).
Es ist ein weiterer Fall für die
input
s‘checked
Eigenschaft. Die DOM-Eigenschaft gibt zurücktrue
oderfalse
während das Attribut die Zeichenfolge"checked"
oder eine leere Zeichenfolge zurückgibt .Und dann gibt es einige Eigenschaften, die nur in eine Richtung synchronisiert werden . Das beste Beispiel ist die
value
Eigenschaft einesinput
Elements. Durch Ändern des Werts über die DOM-Eigenschaft wird das Attribut nicht geändert (Bearbeiten: Überprüfen Sie den ersten Kommentar auf mehr Genauigkeit).Aus diesen Gründen würde ich vorschlagen, dass Sie weiterhin die DOM- Eigenschaften und nicht die Attribute verwenden, da sich deren Verhalten zwischen den Browsern unterscheidet.
In der Realität gibt es nur zwei Fälle, in denen Sie die Attribute verwenden müssen:
value
einesinput
Elements).Wenn Sie eine ausführlichere Erklärung wünschen, empfehle ich Ihnen dringend, diese Seite zu lesen . Es dauert nur ein paar Minuten, aber Sie werden von den Informationen (die ich hier zusammengefasst habe) begeistert sein.
quelle
value
Eigenschaft einer Eingabe erhält ihren Anfangswert vom Attribut, ist aber ansonsten überhaupt nicht daran gebunden. Dasvalue
Attribut wird stattdessen vollständig mit derdefaultValue
Eigenschaft synchronisiert . Ebensochecked
unddefaultChecked
. Außer im alten IE (<= 7 und Kompatibilitätsmodi später), der defekt istgetAttribute()
undsetAttribute()
.a.href
vollständige URL zurück unda.getAttribute("href")
gibt das Attribut genau als Defiend in der HTML-Quelle zurück.input.formAction
) oder eine leere Zeichenfolge (z. B.a.download
) zurück, wodurch die Dinge mehrdeutig werden. Die einzige Ausnahme sind Werte, die nicht in beide Richtungen synchronisiert sind, zvalue
.getAttribute('attribute')
Normalerweise wird der Attributwert als Zeichenfolge zurückgegeben, genau wie in der HTML-Quelle der Seite definiert.Könnte
element.attribute
jedoch einen normalisierten oder berechneten Wert des Attributs zurückgeben. Beispiele:<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>
quelle
.id
spart den Funktionsaufruf-Overhead. (Das ist sehr klein, aber du hast gefragt.)quelle
Demnach ist der jsPerf-Test
getAttribute
langsamer als dieid
Eigenschaft.PS
Seltsamerweise sind beide Anweisungen im IE8 sehr schlecht (im Vergleich zu anderen Browsern).
quelle
Verwenden Sie die Eigenschaften immer, es sei denn, Sie haben einen bestimmten Grund, dies nicht zu tun.
getAttribute()
undsetAttribute()
sind im älteren IE defekt (und Kompatibilitätsmodus in späteren Versionen)Es gibt einige Ausnahmen :
<form>
ElementenIch habe einige Male über dieses Thema auf SO geschrieben:
quelle
Versuchen Sie das folgende Beispiel, um dies vollständig zu verstehen. Für die unten stehende DIV
<div class="myclass"></div>
Das
Element.getAttribute('class')
wird zurückgegeben,myclass
aber Sie müssen es verwendenElement.className
, um es von der DOM-Eigenschaft abzurufen.quelle
Ein Bereich, in dem dies einen großen Unterschied macht, ist das CSS-Styling basierend auf Attributen.
Folgendes berücksichtigen:
Das div mit dem benutzerdefinierten Eigenschaftssatz spiegelt direkt nicht den Wert des Attributs wider und wird nicht von unserem Attributselektor (
div[custom]
) im CSS ausgewählt.Das div mit dem benutzerdefinierten Attributsatz, das mit verwendet wird
setAttribute
, kann jedoch mit einem CSS-Attributselektor ausgewählt und entsprechend gestaltet werden.quelle