jQuery 1.6.1での変更後、プロパティと属性の違いをHTMLで定義しようとしています。
jQuery 1.6.1リリースノート(下部近く)のリストを見ると、HTMLのプロパティと属性を次のように分類できるようです。
プロパティ:boolean値を持つもの、またはselectedIndexなどのUAで計算されるものすべて。
属性:ブール値でもUAで生成された値でもないHTML要素に追加できる「属性」。
考え?
jQuery 1.6.1での変更後、プロパティと属性の違いをHTMLで定義しようとしています。
jQuery 1.6.1リリースノート(下部近く)のリストを見ると、HTMLのプロパティと属性を次のように分類できるようです。
プロパティ:boolean値を持つもの、またはselectedIndexなどのUAで計算されるものすべて。
属性:ブール値でもUAで生成された値でもないHTML要素に追加できる「属性」。
考え?
回答:
HTMLソースコードを記述する場合、HTML要素に属性を定義できます。次に、ブラウザーがコードを解析すると、対応するDOMノードが作成されます。このノードはオブジェクトであるため、プロパティがあります。
たとえば、次のHTML要素:
<input type="text" value="Name:">
には2つの属性があります(type
およびvalue
)。
ブラウザがこのコードを解析すると、HTMLInputElementオブジェクトが作成され、このオブジェクトには、accept、accessKey、align、alt、attributes、autofocus、baseURI、checked、childElementCount、childNodes、children、classList、classNameなどの多数のプロパティが含まれます。 clientHeightなど
特定のDOMノードオブジェクトの場合、プロパティはそのオブジェクトのプロパティであり、属性はattributes
そのオブジェクトのプロパティの要素です。
特定のHTML要素に対してDOMノードが作成されると、そのプロパティの多くは同じまたは類似した名前の属性に関連しますが、1対1の関係ではありません。たとえば、次のHTML要素の場合:
<input id="the-input" type="text" value="Name:">
対応するDOMノードが有するであろうid
、type
及びvalue
(とりわけ)特性:
id
プロパティがあり、反射プロパティのためのid
属性:プロパティを取得する属性値を読み出し、そのプロパティを設定すると、属性値を書き込みます。id
ある純反射性、それが値を変更したり、限定するものではありません。
type
プロパティがあり、反射プロパティのためのtype
属性:プロパティを取得する属性値を読み出し、そのプロパティを設定すると、属性値を書き込みます。既知の値(たとえば、入力の有効なタイプ)にtype
制限されているため、純粋に反映されたプロパティではありません。あなたが持っていた場合<input type="foo">
、その後、theInput.getAttribute("type")
あなたを与える"foo"
が、theInput.type
あなたを与えます"text"
。
対照的に、value
プロパティはvalue
属性を反映しません。代わりに、それは入力の現在の値です。ユーザーが入力ボックスの値を手動で変更すると、value
プロパティはこの変更を反映します。したがって、ユーザーが"John"
入力ボックスに入力すると、次のようになります。
theInput.value // returns "John"
一方:
theInput.getAttribute('value') // returns "Name:"
value
プロパティには反映され、現在のに対し、入力ボックス内のテキスト・コンテンツをvalue
属性が含まれている初期のテキストコンテンツvalue
のHTMLソースコードから属性を。
したがって、テキストボックス内の現在の内容を知りたい場合は、プロパティを参照してください。ただし、テキストボックスの初期値を知りたい場合は、属性を読み取ります。またはdefaultValue
、value
属性を純粋に反映したプロパティを使用することもできます。
theInput.value // returns "John"
theInput.getAttribute('value') // returns "Name:"
theInput.defaultValue // returns "Name:"
そこに直接自分の属性を反映するいくつかのプロパティは(あるrel
、id
)、いくつかは少し-異なる名前との直接反射である(htmlFor
反映for
属性をclassName
反映したclass
属性)を、多くの人が自分の属性を反映していることが、制限/修正を加えた(src
、href
、disabled
、multiple
そう)、およびオン。仕様はさまざまな種類の反射をカバーしています。
for
->などhtmlFor
)と、同様に属性から初期値を取得するが、それを反映しないプロパティのリストはどこにありますか(input.value
)。これはgithub.com/Matt-Esch/virtual-domのようなライブラリのソースのどこかにあると思いますが、実際にはドキュメント化されていません。
Sime Vidasの回答を読んだ後、私はさらに検索し、角度付きのドキュメントで非常に簡単で理解しやすい説明を見つけました。
HTML属性とDOMプロパティ
属性はHTMLによって定義されます。プロパティはDOM(Document Object Model)によって定義されます。
一部のHTML属性には、プロパティへの1:1マッピングがあります。
id
一例です。一部のHTML属性には対応するプロパティがありません。
colspan
一例です。一部のDOMプロパティには対応する属性がありません。
textContent
一例です。多くのHTML属性はプロパティにマップされているように見えますが、思ったとおりではありません!
最後のカテゴリは、この一般的なルールを理解するまで混乱します。
属性はDOMプロパティを初期化し、それが行われます。プロパティ値は変更される可能性があります。属性値はできません。
たとえば、ブラウザがをレンダリングすると
<input type="text" value="Bob">
、value
「Bob」に初期化されたプロパティを持つ対応するDOMノードが作成されます。ユーザーが入力ボックスに「サリー」と入力すると、DOM要素の
value
プロパティは「サリー」になります。しかし、HTMLのvalue
属性については、入力要素にその属性について尋ねるかどうかを確認しても変化しませんinput.getAttribute('value')
。「Bob」を返します。HTML属性
value
は初期値を指定します。DOMvalue
プロパティは現在の値です。
disabled
属性は、別の特異な例です。ボタンのdisabled
プロパティはfalse
デフォルトで設定されているため、ボタンが有効になります。disabled
属性を追加すると、その存在だけでボタンのdisabled
プロパティが初期化さtrue
れ、ボタンが無効になります。
disabled
属性を追加および削除すると、ボタンが無効および有効になります。属性の値は無関係です。そのため、次のように記述してボタンを有効にすることはできません<button disabled="false">Still Disabled</button>.
ボタンの
disabled
プロパティを設定すると、ボタンが無効または有効になります。プロパティの値は重要です。HTML属性とDOMプロパティは、同じ名前であっても同じではありません。
colspan
属性にはcolSpan
プロパティがあります。...では、どの属性に現在関連するプロパティがないのですか?
答えは、属性とプロパティがどのように異なる方法で処理されるかをすでに説明していますが、これがどれほど正気でないかを本当に指摘したいと思います。ある程度スペックがあっても。
一部の属性(id、class、foo、barなど)がDOMで1種類の値のみを保持する一方で、一部の属性(たとえば、checked、selected)が2つの値を保持するのはおかしいです。つまり、「ロードされたとき」の値と「動的状態」の値です。(DOMは、ドキュメントの状態を完全に表すものではないのですか?)
それはことを、絶対に不可欠である二つの入力フィールド、例えばテキストやチェックボックスの 非常に同じように振る舞います。テキスト入力フィールドが「ロードされたとき」の値と「現在の動的」な値を別々に保持していない場合、チェックボックスはなぜですか?チェックボックスにchecked属性の値が2つある場合、class属性とid属性の値が2つないのはなぜですか?テキストの * input *フィールドの値を変更する予定で、DOM(つまり、「シリアル化された表現」)が変更されることを期待し、この変更を反映する場合、なぜ地球の入力フィールドに同じことが期待されないのでしょうか。タイプチェックボックス チェックされた属性で?
「ブール属性です」の区別は、私にはまったく意味をなさないか、少なくともこれの十分な理由ではありません。
checked
属性が表されるdefaultChecked
(同様に、テキスト入力のためのプロパティvalue
属性で表されるdefaultValue
プロパティ)。2番目のプロパティはchecked
、チェックボックスがオンになっているかどうかを表すために必要です。これはチェックボックスの機能の本質的な部分です。これはインタラクティブであり、ユーザーが変更できます(フォームのリセットボタンが存在する場合はデフォルトにリセットできます)。など、別の属性id
がそうではない方法で。それがブール属性であるという事実とは何の関係もありません。
これらはw3cによって属性とは何か、プロパティとは何かによって指定されます 。
しかし、現在attrとpropはそれほど異なっておらず、ほぼ同じです。
しかし、彼らはいくつかのもののために小道具を好みます
優先使用法の要約
.prop()メソッドは、ブール型の属性/プロパティ、およびHTMLに存在しないプロパティ(window.locationなど)に使用する必要があります。その他すべての属性(htmlで確認できる属性)は、.attr()メソッドで引き続き操作できます。
よく実際にあなたはattrまたはpropまたは両方を使用する場合、何かを変更する必要はありません。両方とも機能しますが、私は自分のアプリケーションでatrrが機能しない場所でpropが機能することを見たので、1.6アプリpropを取り込みました=)
HTMLの違いを評価する前に、まずこれらの単語の定義を見てみましょう。
英語の定義:
HTMLコンテキストでは:
ブラウザがHTMLを解析すると、基本的にHTMLのメモリ内表現であるツリーデータ構造が作成されます。ツリーデータ構造には、HTML要素とテキストであるノードが含まれます。これに関連する属性とプロパティは次のようになります。
これらのプロパティのマッピングが1対1ではないことを理解することも重要です。つまり、HTML要素に指定するすべての属性が同様の名前付きDOMプロパティを持つわけではありません。
さらに、異なるDOM要素に異なるプロパティがあります。たとえば、<input>
要素にはプロパティに存在しない値プロパティがあり<div>
ます。
次のHTMLドキュメントを見てみましょう。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"> <!-- charset is a attribute -->
<meta name="viewport" content="width=device-width"> <!-- name and content are attributes -->
<title>JS Bin</title>
</head>
<body>
<div id="foo" class="bar foobar">hi</div> <!-- id and class are attributes -->
</body>
</html>
次に<div>
、JSコンソールでを検査します。
console.dir(document.getElementById('foo'));
次のDOMプロパティが表示されます(すべてのプロパティが表示されているわけではありません)。
class
JSでは予約キーワードです)。しかし、実際には2つのプロパティ、classList
およびclassName
。