2011-07-29 33 views
2

JQueryでバグを報告する前に、これをここに投稿して議論してください。JQueryは、空の属性セレクタが空でない入力を返します。

はこのバイオリンを考えてみましょう:

http://jsfiddle.net/tWPS6/2/

私はHTML、他の使用してJavascriptの内の1つの入力のvalue属性を設定します。次に、空の入力(値== ""の入力)を選択するようにJQueryに依頼します。長さ1を返します(そしてその中の1つの入力は#input2です)。

この空の属性セレクタは、value属性をチェックする他の手段(.valueまたは.valueなど)が使用されているにもかかわらず、入力タグの元の値に基づいて元のHTMLでは現在の値ではなく選択しているかのようです。 val())は、実際には空ではないことを表示します。

これはJQueryのバグのようです。正しい?このショットを与える

答えて

4

ファーストとは:

これは、jQueryのではバグではありません。

要素 属性の間に有意な差があります:

var attr = element.getAttribute('foo'); 

と要素プロパティ:

var prop = element.foo; 

This answerは非常にうまくそれをレイアウト—が短いバージョンがあることです属性とプロパティが混乱していて、ブラウザーが必ずしも正しいとは限りませんでしたが、you almost always want to use the property, not the attribute when working with the DOM

属性については忘れてください。ほとんどの場合、属性ではなくプロパティが必要です。同じ名前のプロパティと属性の両方が存在する場合、このプロパティは常に現在の状態を表し、属性(ほとんどのブラウザで)は初期状態を表します。これは、<input>要素のvalueプロパティなどのプロパティに影響します。


あなたは今、属性クラスタ!@#$を理解していれば、あなたがうまくいけば、これが起こっている場所を確認する必要があります。

セレクタ'input[value=""]'は、属性セレクタです。つまり、プロパティセレクタではありません。

  • value属性が空の文字列と等しいことvalue属性を持ち、かつ
  • :その要素(とのみ、その要素)が1であるため、両方のあなたの例ではラウンド、$('input[value=""]')試合のみ<input id="input2" value=""/>では、 。

.val()は、値属性ではなく<input>要素のvalueプロパティを設定します。属性セレクタは、名前が示すように、要素の属性と一致します。したがって、属性が変更されていない場合は、別のものを選択しません。

また、jQueryのは、ボンネットの下に派手なもののすべての種類のことを行います(

  • は、ブラウザ間で一貫性のある動作を提供し、そして
  • は、ドキュメントで一貫した動作を提供し、そして.attr()と特に
  • ましたquite the checkered pastがあります)本当に醜いことができます。

ああ、そして最後のリンク:John Resig on jQuery 1.6 and .attr()読んでください。

+0

私は実際に.attr()を過去に読んでいます。だからあなたは、私のコードで入力の値を設定するすべてのコードは、.valueと.val()の代わりに.attr()を使って設定するべきだと提案していますか?これは重大な書き換えであり、おそらくコードサイズには少し害があります。 –

+0

いいえ、値を設定するすべてのコードは '.val()'に固執する必要があります。 _attribute_セレクタを使用して値で_select_することはできませんので、変更してください。 –

+0

はい、ちょうど最も安いコードパスを見つけようとしています。 –

0

試してみてください。

var emptyInputsRound1 = $('input[value=""]'); 
$('#input2').attr("value",'hi2'); //notice change 
var emptyInputsRound2 = $('input[value=""]'); 
$('#output').text(emptyInputsRound1.length + ', ' + emptyInputsRound2.length); 

作業例:一番http://jsfiddle.net/fSaQh/

+0

しかし、その後、それはそうのように設定されていますとき: http://jsfiddle.net/fSaQh/1/ 戻る奇妙な結果に。これは本当にJQueryのバグのようです。 –

+0

これはかなり奇妙なことですが、attr()がdomを変更している間に、.val()がjqueryオブジェクトに影響して実際のDOMをラップしていないように思えるかもしれませんが、jqueryの専門家この –

関連する問題