jQuery UI:数据选择器不返回HTML5数据属性

时间:2013-01-30 19:06:25

标签: jquery jquery-ui selector

假设我有这段HT​​ML:

<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)

有什么想法吗?

更多信息:我正在使用jQuery 1.9.0和jQuery UI 1.9.2

** 修改 **

知道关于$("#container").find("a[data-some-info]")。这不是我在这里提出的问题。如果有data selector,为什么它会这样?

3 个答案:

答案 0 :(得分: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 $().data向元素添加数据,如果jQuery不更新属性,则可能与该选择器不匹配。

答案 1 :(得分:1)

来自文档,

  

表达式$( "div:data(foo)")<div>匹配,如果它通过.data( "foo", value )存储数据

从jquery代码 - &gt;

  

jQuery data()存储在对象内部数据中的单独对象中   缓存以避免内部数据与用户定义之间的密钥冲突   数据(来自jQuery代码的评论)

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

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

当它在HTML中定义时,它只是一个用户定义的数据元素,不会被jQuery :data选择器选中。

但是,当您调用.data(some-info)时,它实际上会读取用户定义的数据并将其复制到内部数据,然后使用:data选择元素,因为它可以在内部数据中找到它。 / p>

NOT 是一个错误,因为文档中明确提到了这一点。


您应该使用.length属性来获取选择器中返回元素的数量。

jQuery 1.8 以来,{I}也不推荐使用.sizehttp://api.jquery.com/size/

答案 2 :(得分:1)

:数据选择器不是JQuery核心的一部分。这可能是一个错误,但JQuery文档说HTML5数据属性被拉入内部JQuery数据对象(可能是在调用.data时),而不是作为:data伪选择器的一部分提供(根据JQuery UI文档查询内部数据表示并且没有说明HTML5数据属性)

替代方法:

使用$("#container").find("a[data-some-info='foo']"),或者如果在数据属性.find("a[data-some-info]")上设置了任何内容,则使用{{1}}。