jQuery UI:数据选择器不返回HTML5数据属性
假设我有一段HTML:jQuery UI:数据选择器不返回HTML5数据属性,jquery,jquery-ui,selector,Jquery,Jquery Ui,Selector,假设我有一段HTML: <div id="container"> <ul> <li><a href="#" data-some-info="foo">Bar</a> <!-- repeating a few like the one --> --> <!-- above for a while ...
<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>
有什么想法吗
更多信息:我正在使用jQuery 1.9.0和jQuery UI 1.9.2
**编辑**
我知道$(“#容器”)。查找(“a[data some info]”
。这不是我在这里要问的问题。如果有,为什么会这样做?来自文档
表达式$(“div:data(foo)”)
与通过.data(“foo”,value)”存储数据的
匹配
来自jquery代码->
jQuerydata()
存储在对象内部数据中的一个单独对象中
缓存,以避免内部数据和用户定义数据之间的密钥冲突
数据(来自jQuery代码的注释)
当它在HTML中定义时,它只是一个用户定义的数据元素,jQuery:data
选择器不会选择它
但是,当您调用.data(some info)
时,它实际上读取用户定义的数据并将其复制到内部数据,然后使用:data
拾取元素,因为它可以在内部数据中找到它
这不是一个bug,因为文档中明确提到了这一点
您应该使用.length
,这是一个属性,用于从选择器获取返回元素的数量
另外,.size
也不推荐使用,因为从jQuery 1.8开始 数据选择器不是JQuery核心的一部分。这可能是一个bug,但是JQuery文档说HTML5数据属性被拉入内部JQuery数据对象(可能是在调用.data
)中,而不是作为:data
伪选择器的一部分(根据jQueryUI,文档按原样查询内部数据表示,而不涉及HTML5数据属性)
备选办法:
使用$(“#容器”).find(“a[data-some-info='foo']”
,或者如果在数据属性上设置了任何内容,.find(“a[data-some-info]”
这是选择器的实现方式:
$.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 ] );
},
$.extend($.expr[“:”]{
数据:$.expr.createPseudo?
$.expr.createPseudo(函数(dataName){
返回函数(elem){
return!!$.data(elem,dataName);
};
}) :
//支持:jQuerylength
或size
,它不会改变任何东西。但我会记住size
:)它不是一个bug,但显然是一个意外行为,因为当您调用.data(一些信息)时返回用户数据。不,我是问为什么会这样。到目前为止,您似乎有正确的答案…在所有情况下看起来都是未定义的行为(没有很好的文档记录)我建议对JQuery UI人员进行修复,使:data
选择器的工作方式更像对.data
的调用,但出于性能原因,可能会采用这种方式。我认为用例是选择先前对.data(key,val)的调用所设置的内容
混合使用CSS和内部存储。:data
选择器是否有可用的文档?我猜它是一个jQuery CSS选择器,只查看已经缓存的元素数据(这至少可以解释您看到的行为)啊,它是由jQuery UI添加的。请注意,文档根本没有引用它,而是通过数据属性进行选择。@KevinB,您可能在这里发现了一些东西。
$.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 ] );
},