ティムの言ったことはとても上手だと思いますが、話を戻しましょう。
DOM 要素はオブジェクトであり、メモリ内のものです。OOP のほとんどのオブジェクトと同様に、プロパティがあります。また、個別に、要素で定義された属性のマップもあります (通常は、要素を作成するためにブラウザーが読み取ったマークアップから取得されます)。要素のプロパティの一部は、同じまたは類似の名前を持つ属性から初期値を取得します ( は「value」属性から初期値を取得します。「href」属性から初期値を取得しますが、まったく同じ値ではありません。 「クラス」属性)。他のプロパティは、別の方法で初期値を取得します。たとえば、プロパティは親要素が何であるかに基づいて値を取得します。value
href
className
parentNode
style
プロパティ、「スタイル」属性があるかどうか。
のページでこのアンカーを考えてみましょうhttp://example.com/testing.html
:
<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>
いくつかの不当な ASCII アート (および多くのものを省略):
+---------------------------------------+
| | HTMLアンカー要素 |
+---------------------------------------+
| | href: "http://example.com/foo.html" |
| | 名前: "fooAnchor" |
| | id: "fooAnchor" |
| | className: "テスト 1" |
| | 属性: |
| | href: "foo.html" |
| | 名前: "fooAnchor" |
| | id: "fooAnchor" |
| | クラス: "テスト 1" |
+---------------------------------------+
プロパティと属性は異なることに注意してください。
現在、それらは別個のものですが、これらはすべてゼロから設計されたのではなく進化したため、多くのプロパティは、設定した場合に派生元の属性に書き戻されます。しかし、すべてがそうであるとは限りません。上からわかるhref
ように、マッピングは必ずしも単純に「値を渡す」とは限らず、解釈が必要になる場合もあります。
オブジェクトのプロパティであるプロパティについて話すとき、私は抽象的に話しているわけではありません。jQuery 以外のコードを次に示します。
var link = document.getElementById('fooAnchor');
alert(link.href); // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"
(これらの値はほとんどのブラウザーと同じです。多少の違いがあります。)
オブジェクトは実在するものであり、そのオブジェクトのプロパティへのアクセスと属性link
へのアクセスには実際の違いがあることがわかります。
Tim が言ったように、ほとんどの場合、プロパティを操作したいと考えています。その理由の 1 つは、それらの値 (名前でさえも) がブラウザー間でより一貫している傾向があるためです。ほとんどの場合、関連するプロパティ (カスタム属性) がない場合、またはその特定の属性について、属性とプロパティが 1:1 ではないことがわかっている場合にのみ、属性を操作したいと考えています (href
上記の「href」と同様)。 .
標準プロパティは、さまざまな DOM 仕様に配置されています。
これらの仕様には優れたインデックスがあり、それらへのリンクを手元に置いておくことをお勧めします。私はいつもそれらを使用しています。
カスタム属性には、たとえば、コードにメタデータを提供するために要素に配置する可能性のある属性が含まれます (接頭辞data-xyz
に固執する限り、これは HTML5 の時点で有効です)。(最近のバージョンの jQuery では、関数を介して要素data-
にアクセスできますが、その関数は単なる属性のアクセサーではありません[それ以上の機能とそうでない機能の両方を実行します]。実際にその機能が必要でない限り、私は関数を使用して対話します属性付き。)data-xyz
data
data-xyz
attr
data-xyz
このattr
関数には、文字どおり属性を取得するのではなく、ユーザーが必要だと考えたものを取得するための複雑なロジックが含まれていました。それは概念を混同しました。prop
andへの移動は、attr
それらの統合を解除することを目的としていました。簡単に言うと、v1.6.0 では jQuery はその点で行き過ぎていましたが、技術的attr
に.attr
prop