5

私がこのHTMLを持っているとしましょう:

<div id="container">
   <ul>
       <li><a href="#" data-some-info="foo">Bar</a>
       <!-- repeating a few like the one -->                          -->
       <!-- above for a while ...        -->
   </uL>
</div>

some-infoそして、データが定義されたときに、データを含むすべてのアンカー要素に何かを適用したいと思います。

この動作がなぜバグなのかを理解したいだけです(バグですか?)

$("#container").find("a:data(some-info)").size();  // -> 0
$("#container").find("a").data("some-info");       // -> "foo"
$("#container").find("a:data(some-info)").size();  // -> 1 (actual expected val)

何か案は?

詳細:jQuery1.9.0とjQueryUI1.9.2を使用しています

**編集**

私は知ってい$("#container").find("a[data-some-info]")ます。これは私がここで質問することではありません。データセレクターがある場合、なぜこのように動作するのですか?

4

3 に答える 3

3

セレクターの実装方法は次のとおりです。

$.extend( $.expr[ ":" ], {
    data: $.expr.createPseudo ?
        $.expr.createPseudo(function( dataName ) {
            return function( elem ) {
                return !!$.data( elem, dataName );
            };
        }) :
        // support: jQuery <1.8
        function( elem, i, match ) {
            return !!$.data( elem, match[ 3 ] );
        },

(参照https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.core.js#L160

$.dataではなく、どのように使用されているかに注意してください$(elem).data。これは、$.dataまたは$().dataメソッドのいずれかを介して要素に格納されているデータのみを検索することを意味します。要素のデータ属性を検索せず、その目的を意図したものではないと思います。属性がセレクターと等しいのは、使用する必要があるものです。[data-foo]ただし、属性を確認することに注意してください。jQueryを使用して要素にデータを追加すると、$().datajQueryが属性を更新しない場合、そのセレクターと一致しない可能性があります。

于 2013-01-30T19:22:24.560 に答える
1

:dataセレクターはJQueryコアの一部ではありません。バグかもしれませんが、JQueryのドキュメントによると、HTML5データ属性は.data疑似:dataセレクター(JQueryUIのドキュメントによると内部データ表現はそのままで、HTML5データ属性については何も述べていません)

別のアプローチ:

を使用$("#container").find("a[data-some-info='foo']")します。または、データ属性に何かが設定されている場合は、を使用します.find("a[data-some-info]")

于 2013-01-30T19:10:08.563 に答える
1

ドキュメントから、

を介してデータが保存されている場合、式はに$( "div:data(foo)")一致します<div>.data( "foo", value )

そしてjqueryコードから->

jQuerydata()は、内部データとユーザー定義データの間のキーの衝突を回避するために、オブジェクトの内部データキャッシュ内の別のオブジェクトに格納されます(jQueryコードからのコメント)

https://github.com/jquery/jquery/blob/master/src/data.js#L51

https://github.com/jquery/jquery/blob/master/src/data.js#L63

:dataHTMLで定義されている場合、jQueryセレクターによって選択されないのはユーザー定義のデータ要素にすぎません。

ただし、を呼び出すと.data(some-info)、実際にユーザー定義データを読み取り、それを内部データにコピーし、後で内部データで:data見つけた要素を使用して取得します。

これはドキュメントに明確に記載されているため、バグではありません。


.lengthセレクターから返される要素の数を取得するには、これをプロパティとして使用する必要があります。

また、 jQuery 1.8.size以降、非推奨になりました。http://api.jquery.com/size/

于 2013-01-30T19:07:49.090 に答える