Attributeとカスタムプロパティ
23593 ワード
DOMノードにはattributeとpropertyがある可能性があります.時には人々が区別できないことがあります.彼らは関連しているからですが、それらは全然違います.
property
DOMはオブジェクトです.したがって、カスタムpropertyおよびメソッドを通常のオブジェクトのように格納できます.
次の例ではdocument.bodyカスタムオブジェクトmyDataを追加します.
document.body.myData = {
name: 'John'
}
alert(document.body.myData.name) // John
document.body.sayHi = function() {
alert(this.nodeName)
}
document.body.sayHi() // BODY
JavaScriptのカスタムpropertyとメソッドはHTMLには影響しません.
カスタムpropertyもforを使用できます..in遍歴を行う.
document.body.custom = 5
var list = []
for(var key in document.body) {
list.push(key)
}
alert(list.join('
'))
カスタムDOM property:
attribute
DOMノードは、次の方法でHTML attributeにアクセスします.
elem.hasAttribute(name)
-attributeがelem.getAttribute(name)
-attributeの値elem.setAttribute(name, value)
-attributeの値elem.removeAttribute(name)
-attribute IE<8とIE互換ビューではattributeが若干一致しない
propertyの考え方とattributeには以下の特性があります.
たとえば、次の例を見てみましょう.
<body>
<div about="Elephant" class="smiling"></div>
<script>
var div = document.body.children[0]
alert( div.getAttribute('ABOUT') ) // (1)
div.setAttribute('Test', 123) // (2)
alert( document.body.innerHTML ) // (3)
</script>
</body>
上のコードを実行すると、次のことに気づきます.
propertyとattributeの同期
すべてのDOMノードに標準属性があります.
たとえば、「A」タブを見てみましょう.詳細は表示です.
「href」と「accessKey」と他のattributeがあります.このほか、HTMLElementから「id」や他のattributeも継承されます.
標準のDOMプロパティはattributeと同期します.
id
たとえば、ブラウザは「id」attributeと「id」propertyを同期します.
<script>
document.body.setAttribute('id','la-la-la')
alert(document.body.id) // la-la-la
</script>
href
同じ値は保証できません.「href」を例に挙げて説明しましょう
<a href="#"></a>
<script>
var a = document.body.children[0]
a.href = '/'
alert( 'attribute:' + a.getAttribute('href') ) // '/'
alert( 'property:' + a.href ) // IE: '/', others: full URL
</script>
それは、W 3 C仕様によれば、完全なフォーマットのリンクでなければならないからです.
同期するattributeもありますが、コピーは行われません.例えばinput.checked:
<input type="checkbox" checked>
<script>
var input = document.body.children[0]
alert( input.checked ) // true
alert( input.getAttribute('checked') ) // empty string
</script>
input.checkedのpropertyはtrueかfalseかです.ただし、attributeでは設定された文字列です.
value
一部の組み込みプロパティでは、一方向同期のみが使用されます.
例えばinput.valueはattributeによって同期されます.
<body>
<input type="text" value="markup">
<script>
var input = document.body.children[0]
input.setAttribute('value', 'new')
alert( input.value ) // 'new', input.value changed
</script>
</body>
しかしattributeはpropertyに同期されません
<body>
<input type="text" value="markup">
<script>
var input = document.body.children[0]
input.value = 'new'
alert(input.getAttribute('value')) // 'markup', not changed!
</script>
</body>
「value」プロパティが更新されると、attributeは元の値を保持し、inputが変更されたかどうかを検出したり、リセットしたりすることができます.
class/className
「class」attributeは「className」propertyに対応します.
「class」はJavaScriptで予約された単語であるため、「class」attributeのプロパティはclassNameです.
<body>
<script>
document.body.setAttribute('class', 'big red bloom')
alert( document.body.className ) // ^^^
</script>
</body>
なお、上記の例は、attributeとpropertyが混在しているため、IE<9では正しくない.
クラスを操作するときにattributeではなくclassNameを常に使用するだけで、それをうまく解決できます.
"data-widgetName"
attributeの値<body>
<!-- hello world! don't remove me.-->
<div data-widgetName="menu">Select the genre</div>
<script>/* ... */</script>
</body>
参考答案
旧IEのエピソード
まず、IE<9の場合、すべてのattributeとpropertyが同期されます.
document.body.setAttribute('try-in-ie', 123)
alert( document.body['try-in-ie'] === 123 ) // true in IE<9
注意タイプも同じです.attributeが文字列に変換されていない場合.
次に、IE<8(またはIE 8互換モード)propertyとattributeは同じである.これは多くの興味深い結果をもたらします.
たとえば、propertyには大文字と小文字がありますが、attributeでは大文字と小文字は区別されません.ブラウザが彼ら2人が同じだと思っている場合、次のコードはどのような結果をもたらしますか?
document.body.abba = 1 // assign property (now can read it by getAttribute)
document.body.ABBA = 5 // assign property with another case
// must get a property named 'ABba' in case-insensitive way.
alert( document.body.getAttribute('ABba') ) // ??
ブラウザは最初の値をデフォルト値として選択します.また、getAttributeメソッドでは、IEブラウザのみの2番目のパラメータを提供し、大文字と小文字を区別するかどうかを判別します.詳細はMSDN getAttribute
IE<9「class」attributeがクラスを変更できない限り.このattributeは使用しないで、常にclassName propertyを使用します.
IEと仲良くするためには、attributeを正しく使う必要があります.
あるいは、言い換えれば、attributeを使用する必要があるまでpropertyを常に使用してみてください.
次の場合、attributeが本当に必要になります.
attributeはDOMノードとして
attributeはelementを通過することもできる.attributesコレクションにアクセスします.
attributes結合では、各attributeはこれらの特性を有する.名前、値、その他のプロパティがあります.
<span style="color:blue" id="my">text</span>
<script>
var span = document.body.children[0]
alert( span.attributes['style'].value ) // "color:blue;"
alert( span.attributes['id'].value ) // "my"
</script>
ちなみに、IE<8またはIE互換モードではstyle attributeがクレイジーな結果をもたらします.原因を当てる.
attribute DOMノードはドキュメントツリーの一部ではなく、element要素のみでアクセスできます.
まとめ
attributeとpropertyはDOMモデルの核心機能である.
次の表は、関連点と異なる点を示します.
Property
Attribute
任意の値
文字列
大文字と小文字の区別
大文字と小文字は関係ありません
innerHTMLでは表示されません
innerHTMlに表示
HTMLにカスタムattributeを入れたい場合は、HTML 5でdata-*attributeが有効であることを覚えておいてください.HTML 5規格のカスタムattributeの表示
現実的には、DOM propertyの98%が使用されます.
次の2つの状況でのみattributeを使用する必要があります.