回答:
getAttribute
取り出し属性 DOM要素の、しばらくel.id
取り出しプロパティこのDOM要素の。彼らは同じではありません。
ほとんどの場合、DOMプロパティは属性と同期されます。
ただし、同期によって同じ値が保証されるわけではありません。典型的な例は、アンカー要素の間にel.href
ありel.getAttribute('href')
ます。
例えば:
<a href="/" id="hey"></a>
<script>
var a = document.getElementById('hey')
a.getAttribute('href') // "/"
a.href // Full URL except for IE that keeps '/'
</script>
この動作が発生するのは、W3Cによると、hrefプロパティは整形式のリンクでなければならないためです。ほとんどのブラウザはこの標準を尊重します(誰がそうではないでしょうか?)。
input
のchecked
プロパティには別のケースがあります。DOMプロパティが返すtrue
かfalse
、属性が文字列"checked"
または空の文字列を返します。
そして、一方向のみに同期されるいくつかのプロパティがあります。最良の例は、要素のvalue
プロパティですinput
。DOMプロパティを通じてその値を変更しても、属性は変更されません(編集:最初のコメントで精度を確認してください)。
これらの理由により、ブラウザー間で動作が異なるため、属性ではなくDOM プロパティを引き続き使用することをお勧めします。
実際には、属性を使用する必要があるのは2つの場合のみです。
value
のinput
要素)が必要であることを確認してください。より詳細な説明が必要な場合は、このページを読むことを強くお勧めします。ほんの数分で完了しますが、ここでまとめた情報に喜ばれます。
value
入力のプロパティは属性から初期値を取得しますが、それ以外の点ではまったく関連付けられていません。value
属性は完全に代わりと同期しているdefaultValue
プロパティ。同様にchecked
、そしてdefaultChecked
。壊れた古いIE(<= 7と互換性モード以降)を除くgetAttribute()
とsetAttribute()
。
a.href
完全なURLをa.getAttribute("href")
返し、HTMLソースの定義どおりに属性を返します。
input.formAction
または空の文字列(例:)を返すため、a.download
あいまいになります。唯一の例外は、のように双方向で同期されていない値ですvalue
。
getAttribute('attribute')
通常は、ページのHTMLソースで定義されているとおりに、属性値を文字列として返します。
ただし、element.attribute
属性の正規化された値または計算された値を返す可能性があります。例:
<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>
.id
関数呼び出しのオーバーヘッドを節約します。(非常に小さいですが、あなたが尋ねました。)
このjsPerfテストに よるとgetAttribute
、id
プロパティよりもテストが遅くなります。
PS
奇妙なことに、両方のステートメントはIE8で非常に悪いパフォーマンスを示します(他のブラウザーと比較して)。
特定の理由がない限り、常にプロパティを使用してください。
getAttribute()
そしてsetAttribute()
、古いIE(およびそれ以降のバージョンで互換モード)で壊れています<form>
要素の属性へのアクセス私はこの件についてSOで数回書いています:
これが大きな違いを生む1つの領域は、属性に基づくCSSスタイリングです。
以下を検討してください。
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>
カスタムプロパティを直接設定したdivは、属性の値を反映せずdiv[custom]
、CSSの属性セレクター()によって選択されません。
setAttribute
ただし、を使用してカスタム属性を設定したdivは、css属性セレクターを使用して選択し、それに応じてスタイル設定できます。