そのため、 jQuery 1.6 に新しい関数 prop()
が追加されました。
$(selector).click(function(){
//instead of:
this.getAttribute('style');
//do i use:
$(this).prop('style');
//or:
$(this).attr('style');
})
それともこの場合、彼らは同じことをするのですか?
そして、もし私がdoをprop()
を使うように切り替えなければならないとしたら、私が1.6に切り替えれば古いattr()
の呼び出しはすべて壊れるでしょうか?
_ update _
selector = '#id'
$(selector).click(function() {
//instead of:
var getAtt = this.getAttribute('style');
//do i use:
var thisProp = $(this).prop('style');
//or:
var thisAttr = $(this).attr('style');
console.log(getAtt, thisProp, thisAttr);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
<div id='id' style="color: red;background: orange;">test</div>
(このフィドルも参照してください: http://jsfiddle.net/maniator/JpUF2/ )
コンソールはgetAttribute
を文字列として、そしてattr
を文字列として記録しますが、prop
はCSSStyleDeclaration
として記録します、なぜですか?そしてそれは将来の私のコーディングにどのように影響しますか?
2012年11月1日更新
私の元の答えは、特にjQuery 1.6に当てはまります。私のアドバイスは変わりませんが、jQuery 1.6.1は状況をわずかに変更しました:破損したWebサイトの予想される山に直面して、jQueryチーム attr()
を以前の動作に近い(しかし正確に同じではない)に戻しました)ブール属性 。 John Resigも ブログで書いています 。彼らの難しさはわかりますが、attr()
を好むという彼の推奨にはまだ賛成できません。
元の答え
DOMを直接使用せずにjQueryのみを使用したことがある場合、これは紛らわしい変更となる可能性がありますが、概念的には間違いなく改善されます。しかし、この変更の結果として破損するjQueryを使用している膨大な数のサイトにとってはあまり良くありません。
主な問題を要約します。
prop()
ではなくattr()
が必要です。prop()
はattr()
が以前使用していたことを行います。コード内のattr()
の呼び出しをprop()
に置き換えると、通常は機能します。checked
プロパティはブール値、style
プロパティはスタイルごとに個別のプロパティを持つオブジェクト、size
プロパティは数値です。value
およびchecked
:などの入力の特定の属性の場合はそうではありません、プロパティは常に現在の状態を表しますが、属性(IEの古いバージョンを除く)は入力のデフォルト値/チェックに対応します(defaultValue
/defaultChecked
プロパティに反映)。JQueryの開発者であり、このビジネス全体でプロパティと属性について混乱している場合は、jQueryがこのようなことからあなたを守るためにそれほど努力しているわけではないので、一歩後退してそれについて少し学ぶ必要があります。主題についての権威あるがやや乾いたWordには、仕様があります: DOM4 、 HTML DOM 、 DOM Level 2 、 DOMレベル 。 MozillaのDOMドキュメントは最新のブラウザのほとんどで有効であり、仕様より読みやすいため、 DOMリファレンス が役立つ場合があります。 要素プロパティのセクション があります。
プロパティが属性よりも簡単に処理される方法の例として、最初にチェックされるチェックボックスを検討します。これを行うための有効なHTMLの2つの可能な部分を次に示します。
<input id="cb" type="checkbox" checked>
<input id="cb" type="checkbox" checked="checked">
それでは、jQueryでチェックボックスがチェックされているかどうかをどのように確認しますか?スタックオーバーフローを見ると、一般的に次の提案が見つかります。
if ( $("#cb").attr("checked") === true ) {...}
if ( $("#cb").attr("checked") == "checked" ) {...}
if ( $("#cb").is(":checked") ) {...}
これは実際、checked
ブールプロパティを使用する世界で最も単純なものです。これは、1995年以降、すべての主要なスクリプト可能なブラウザに存在し、問題なく機能していました。
if (document.getElementById("cb").checked) {...}
このプロパティは、チェックボックスのチェックまたはチェック解除も簡単にします。
document.getElementById("cb").checked = false
JQuery 1.6では、これは明確になります
$("#cb").prop("checked", false)
チェックボックスのスクリプティングにchecked
属性を使用するという考えは、役に立たず不必要です。プロパティは必要なものです。
checked
属性を使用しているかどうかは明らかではありませんこの変更は、jQueryにとって長い間到来しています。何年もの間、それらはほとんどDOMプロパティを取得するattr()
という名前の関数を持っていて、名前から期待する結果ではありませんでした。 attr()
と prop()
の分離は、HTML属性とDOMプロパティの混乱を軽減するのに役立ちます。 $.fn.prop()
は指定されたDOMプロパティを取得し、$.fn.attr()
は指定されたHTML属性を取得します。
それらがどのように機能するのかを完全に理解するために、HTML属性とDOMプロパティの違いについての詳細な説明を次に示します。
<body onload="foo()">
目的: イベント、レンダリング、その他の目的で、マークアップにデータを関連付けることができます。
視覚化: class属性は本文に表示されています。次のコードからアクセスできます。
var attr;
attr = document.body.getAttribute("class");
//IE 8 Quirks and below
attr = document.body.getAttribute("className");
属性は文字列形式で返され、ブラウザ間で矛盾する可能性があります。ただし、状況によっては不可欠な場合があります。上で例示したように、IE 8 Quirks Mode(およびそれ以下)では、属性名の代わりにget/set/removeAttribute内のDOMプロパティの名前が必要です。これが違いを知ることが重要な多くの理由の1つです。
document.body.onload = foo;
目的: 要素ノードに属するプロパティへのアクセスを許可します。これらのプロパティは属性と似ていますが、JavaScriptを介してのみアクセス可能です。これはDOMプロパティの役割を明確にするのに役立つ重要な違いです。 このイベントハンドラの割り当ては役に立たず、イベントを受け取らないため、属性はプロパティ とはまったく異なることに注意してください。
視覚化:
ここでは、Firebugの[DOM]タブの下にプロパティのリストがあります。これらはDOMプロパティです。あなたはそれを知らずに以前にそれらを使ったことがあるので、すぐにあなたはそれらのかなりの数に気づくでしょう。それらの価値観は、あなたがJavaScriptを通して受け取るものです。
HTML:<textarea id="test" value="foo"></textarea>
JavaScript:alert($('#test').attr('value'));
以前のバージョンのjQueryでは、これは空の文字列を返します。 1.6では、適切な値foo
を返します。
どちらの関数の新しいコードも見ていなくても、混乱はコード自体よりもHTML属性とDOMプロパティの違いに関係していると自信を持って言えます。うまくいけば、これはあなたのためにいくつかのことを片付けた。
- マット
プロパティはDOMにあります。属性はHTMLにあり、DOMに解析されます。
属性を変更すると、その変更はDOMに反映されます(場合によっては異なる名前で)。
例:タグのclass
属性を変更すると、DOM内のそのタグのclassName
プロパティが変更されます。タグに属性がない場合でも、空の値またはデフォルト値を持つ対応するDOMプロパティがあります。
例:タグにclass
属性がありませんが、DOMプロパティclassName
は空の文字列値で存在します。
編集
どちらかを変更すると、もう一方はコントローラによって変更され、またその逆も同様です。このコントローラはjQueryではなく、ブラウザのネイティブコードにあります。
混乱を招くのは、HTML属性とDOMオブジェクトの違いだけです。 this.src
this.value
this.checked
などのDOM要素のネイティブプロパティに慣れている人にとって、.prop
は家族にとってとても暖かい歓迎です。他の人にとっては、混乱を招くだけです。それを明確にしましょう。
.attr
と.prop
の違いを確認する最も簡単な方法は、次の例です。
<input blah="hello">
$('input').attr('blah')
:期待どおりに'hello'
を返します。ここには何の驚きもありません。$('input').prop('blah')
:undefined
- [HTMLInputElement].blah
を実行しようとしているため - が返され、そのDOMオブジェクトにそのようなプロパティは存在しません。それはその要素の属性としてスコープ内にのみ存在します、すなわち[HTMLInputElement].getAttribute('blah')
では、次のようにいくつか変更します。
$('input').attr('blah', 'Apple');
$('input').prop('blah', 'pear');
$('input').attr('blah')
:'Apple'
を返しますか?これがその要素の最後に設定されているので、なぜ「梨」にしないでください。プロパティはDOM入力要素自体ではなくinput属性で変更されたため、それらは基本的に互いに独立して機能します。$('input').prop('blah')
:'pear'
を返しますあなたが本当に注意する必要があるのは上記の理由のためだけのアプリケーション全体で同じプロパティのためにこれらの使用法を混ぜないでくださいです。
違いを示すフィドルを参照してください。http://jsfiddle.net/garreh/uLQXc/
.attr
と.prop
:<input style="font:arial;"/>
.attr('style')
- マッチした要素のインラインスタイル、すなわち"font:arial;"
を返します.prop('style')
- スタイル宣言オブジェクト、すなわちCSSStyleDeclaration
を返します<input value="hello" type="text"/>
$('input').prop('value', 'i changed the value');
.attr('value')
- 'hello'
を返します*.prop('value')
- 'i changed the value'
を返します*注:このため、jQueryには.val()
メソッドがあります。これは、内部的には.prop('value')
と同等です。
TL; DR
ほとんどの場合、prop()
よりattr()
を使います。
property は入力要素の現在の状態です。 属性 がデフォルト値です。
プロパティにはさまざまな種類のものを含めることができます。属性には文字列しか含めることができません
ダーティーチェックネス
この概念は、違いが観察可能な例を提供します。 http://www.w3.org/TR/html5/forms.html#concept-input-checked-dirty
やってみよう:
prop
チェックボックスだけがチェックされました。バング!$('button').on('click', function() {
$('#attr').attr('checked', 'checked')
$('#prop').prop('checked', true)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>attr <input id="attr" type="checkbox"></label>
<label>prop <input id="prop" type="checkbox"></label>
<button type="button">Set checked attr and prop.</button>
Disabled IDL属性はdisabledコンテンツ属性を反映しなければなりません。
それであなたはそれを回避するかもしれません、それが必要なしにHTMLを修正するのでそれは醜いですが。
checked="checked"
のinput type="checkbox"
のような他の属性では、それをクリックすると汚くなり、checked="checked"
コンテンツ属性 を追加または削除してもチェックされなくなります 。
HTMLを変更するという複雑な副作用に頼るのではなく、効果的なプロパティに直接影響を与えるので、ほとんどの場合.prop
を使用する必要があるのはこのためです。
すべてが ドキュメントにあります :
属性とプロパティの違いは、特定の状況では重要になる可能性があります。 jQuery 1.6より前では、.attr()メソッドはいくつかの属性を取得するときにプロパティ値を考慮に入れることがありました。 jQuery 1.6以降、.prop()メソッドは明示的にプロパティ値を取得する方法を提供しますが、.attr()は属性を取得します。
だから支柱を使用してください!
attributes はあなたのHTMLの中にありますtext document/file(==これはあなたのhtmlマークアップがパースされた結果だと思います)
properties はHTML DOM tree(===基本的にはJSの意味でのあるオブジェクトの実際のプロパティ)にあります。
重要なことに、それらの多くは同期されています(class
プロパティを更新すると、htmlのclass
属性も更新されます。それ以外の場合)。 しかし いくつかの属性は予期しないプロパティと同期されるかもしれません - 例えば、 attribute checked
は property defaultChecked
に対応します。
.prop('checked')
の値は変わりますが、.attr('checked')
と.prop('defaultChecked')
の値は変わりません$('#input').prop('defaultChecked', true)
を設定すると.attr('checked')
も変更されますが、これは要素からは見えません。経験則は :
.prop()
メソッドは、ブール型の属性/プロパティ、およびhtmlに存在しないプロパティ(window.locationなど)に使用する必要があります。他のすべての属性(htmlで見ることができるもの)は、.attr()
メソッドを使って操作することができ、これからも続けられます。 ( http://blog.jquery.com/2011/05/10/jquery-1-6-1-rc-1-released/ /)
そして、ここで.prop()
がどこで好まれるかを示すテーブルです(たとえ.attr()
がまだ使われることができるとしても)。
.prop()
は任意の型を返すことができます - 文字列、整数、ブール値。 .attr()
は常に文字列を返します。.prop()
は.attr()
の約2.5倍速いと言われています。.attr()
:
.prop()
:
通常はプロパティを使いたいでしょう。次の目的にのみ属性を使用してください。
<input value="abc">.
のような標準のHTML属性の「元の値」を取得しますattributes
- > HTML
properties
- > DOM
JQuery 1.6より前では、attr()
メソッド 時々 は属性の取得時にプロパティ値を考慮していましたが、これはかなり矛盾した振る舞いを引き起こしました。
prop()
メソッドの導入は明示的にプロパティ値を取得する方法を提供しますが、.attr()
は属性を取得します。
ドキュメント:
jQuery.attr()
マッチした要素の集合の中の最初の要素の属性値を取得します。
jQuery.prop()
マッチした要素の集合の最初の要素のプロパティ値を取得します。
prop()
の使い方について注意深く思い出してください。例:
if ($("#checkbox1").prop('checked')) {
isDelete = 1;
} else {
isDelete = 0;
}
上記の関数は、checkbox1がチェックされているかどうかをチェックするために使用されます。そうでない場合は0を返す。関数prop()は、ここではGET関数として使用されている。
if ($("#checkbox1").prop('checked', true)) {
isDelete = 1;
} else {
isDelete = 0;
}
上記の関数は、checkbox1がチェックされ常に1を返すように設定するために使用されます。今度は、関数prop()がSET関数として使用されます。
めちゃくちゃにしないでください
P/S:Image src プロパティをチェックしています。 src が空の場合、propは現在のページのURLを返し(間違った)、attrは空の文字列を返します(右) 。
jQuery 1.6では.prop()関数が導入され、DOMの属性とプロパティが分離され、.attrと.prop関数の違いについて多くの疑問が投げかけられました。
下記の例を参照してください。
例:1)
<input id="demo" type="text" dbvalue="Kansagara" />
$("#demo").attr("dbvalue"); // returns Kansagara
$("#demo").prop("dbvalue"); // returns undefined
.prop()はHTML DOM属性のみの値を返しますが、カスタム属性の値は返しませんでしたが、.attr()も上記のカスタム属性値を返します。
例:2)
<input id="demo" type="text" value="Kansagara" />
さて、テキストボックスの中の「カンサガラ」を「ハイテッシュ」に変更しました。
$("#demo").attr("value"); // returns Kansagara
$("#demo").prop("value"); // returns Hitesh
今、あなたはそれが何を意味するのかを考えました。 DOM内にあり動的であるため、要素のプロパティのみが変更されます。しかし、要素の属性はHTMLテキスト内にあり、変更することはできません。広い意味では、属性は常に現在の状態を表し、属性(古いバージョンのIEを除く)は初期状態を表すか、厳密に定義されているためhtml属性を意味します。この属性は現在の状態について何も伝えません。
チェックボックス用(jquery 1.6以降)
<input id="check1" checked="checked" type="checkbox" />
.attr('checked') //returns checked
.prop('checked') //returns true
.is(':checked') //returns true
propメソッドはchecked、selected、disabled、readOnly..etcのブール値を返し、attrは定義済み文字列を返します。そのため、if条件では直接.prop( 'checked')を使用できます。
.attr()は内部で.prop()を呼び出すので、.attr()メソッドは.prop()を介して直接アクセスするよりもわずかに遅くなります。
JQuery 1.6以降では、propが単純でattrよりも幅が広いため、propが主に使用されます。ほとんどの古いプロジェクトでは、attrは要素の現在の状態情報を取得するために使用されます。しかし今度はpropはこの仕事を引き継ぎ、attrはpropに置き換えられます。
それが役に立てば幸い。
.attr()
でできること.prop()
でできないこと:CSSセレクターに影響を与える他の回答には見られなかった問題があります。
CSSセレクター[name=value]
.attr('name', 'value')
に応答します.prop('name', 'value')
.prop()
は、いくつかの属性セレクターのみに影響します
input[name]
(ありがとう @ TimDown ).attr()
はすべての属性セレクターに影響します
input[value]
input[naame]
span[name]
input[data-custom-attribute]
(.data('custom-attribute')
はこのセレクタに影響しません)1)プロパティがDOMにあります。属性はHTMLにあり、DOMに解析されます。
2)$(elem).attr( "checked")(1.6.1+) "checked"(String)チェックボックスの状態によって変わります
3)$(elem).attr( "checked")(1.6以前)true(Boolean)チェックボックスの状態で変更
ほとんどの場合、data-img, data-xyz
のようなカスタム属性ではなくDOMオブジェクトに使用したいと思います。
チェックボックス(pre-1.6)
からのcheckbox
およびhref
値へのフルリンクとしてのattr()
を持つDOM出力では、Origin
値およびBoolean
にprop()
およびprop()
を付けてアクセスする場合の違いもあります
DOM要素にアクセスできるのはprop
otherだけです。それからundefined
となります。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>prop demo</title>
<style>
p {
margin: 20px 0 0;
}
b {
color: blue;
}
</style>
</head>
<body>
<input id="check1" type="checkbox" checked="checked">
<label for="check1">Check me</label>
<p></p>
<script>
$("input").change(function() {
var $input = $(this);
$("p").html(
".attr( \"checked\" ): <b>" + $input.attr("checked") + "</b><br>" +
".prop( \"checked\" ): <b>" + $input.prop("checked") + "</b><br>" +
".is( \":checked\" ): <b>" + $input.is(":checked")) + "</b>";
}).change();
</script>
</body>
</html>