ティムはかなりうまく言ったと思いますが、一歩戻りましょう。
DOM要素はオブジェクトであり、メモリにあるものです。OOPのほとんどのオブジェクトと同様に、オブジェクトにはプロパティがあります。また、個別に、要素で定義された属性のマップを持っています(通常、ブラウザーが要素を作成するために読み取ったマークアップから取得されます)。要素のいくつかのプロパティは、その取得の初期から値を属性(同一または類似の名前のvalue
「値」属性からその初期値を取得します。href
「のhref」属性からその初期値を取得しますが、それはまったく同じ値ではありません。className
から「クラス」属性)。他のプロパティは、他の方法で初期値を取得します。たとえば、parentNode
プロパティは、親要素が何であるかに基づいて値を取得します。style
「スタイル」属性があるかどうかに関係なく、プロパティ。
のページのこのアンカーを考えてみましょうhttp://example.com/testing.html
:
<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>
いくつかの不必要なASCIIアート(そして多くのものを省く):
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
| HTMLAnchorElement |
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
| 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でないことがわかっている場合(href
上記の "href"と同様)、属性を操作するだけです。。
標準プロパティは、さまざまなDOM仕様に配置されています。
これらの仕様には優れたインデックスがあり、それらへのリンクを手元に置いておくことをお勧めします。いつも使っています。
カスタム属性には、たとえば、data-xyz
メタデータをコードに提供するために要素に配置する可能性のあるすべての属性が含まれます(これは、data-
プレフィックスを使用している限り、HTML5の時点では有効です)。(jQueryの最近のバージョンではdata-xyz
、data
関数を介して要素にアクセスできますが、その関数は単なる属性のアクセサーではありませんdata-xyz
[それよりも多くも少なくも]です。実際にその機能が必要でない限り、私はattr
関数を使用して対話しますdata-xyz
属性。)
このattr
関数は、文字どおりに属性を取得するのではなく、ユーザーが望んでいるものを取得するための複雑なロジックを使用していました。それは概念を融合させました。移動してprop
、attr
それらをデコンフレートすることを意図していました。簡単に言うと、v1.6.0でjQueryはその点で行き過ぎでしたが、技術的に使用する必要があるときattr
に人々が使用する一般的な状況を処理するために機能がすばやく追加されました。attr
prop