jQuery选择所有具有$ jquery.data()的元素


Answers:


98

你可以做

$('[data-myAttr!=""]'); 

这将选择具有data-myAttr不等于'' 属性的所有元素(因此必须已设置);

您也可以使用filter()

$('*').filter(function() {
    return $(this).data('myAttr') !== undefined;
});

68
或者只是:$('[data-myAttr]')
andlrc

4
想到了同样的事情。它没有按预期工作。看到这个演示
gdoron支持Monica 2012年

在第一段代码中缺少结束

1
$('[data-myAttr!=“”]'); 将返回未分配元素的元素。@NULL的注释仅获取设置了该注释的元素。
arleslie

6
错误!正确的解决方案:$('[data-myAttr]')-参见以下答案以获取解释
BassMHL 2015年

75

选择它们的最佳和简单方法是:

$('[data-myAttr]')

更多信息:

我测试了很多东西。

使用$('[data-myAttr!=""]')并非在所有情况下都有效。因为没有一个元素data-myAttr集,都会有自己data-myAttr等于undefined$('[data-myAttr!=""]')会选择那些为好,这是不正确。


4
这仅适用于标记中定义的数据属性。它不适用于通过jQuery定义的数据属性,请参阅jsfiddle.net/2p7h0Lj8/1
Sophivorus

19

您可以使用filter()

var elements = $("*").filter(function() {
    return $(this).data("myAttr") !== undefined;
});

1
即将发布,这里有个小提琴以证明它的工作原理:jsfiddle.net/gbHFZ/1
罗里·麦克罗斯

1
为什么属性选择器不起作用?$('[data-myAttr]')
gdoron支持Monica 2012年

6
@gdoron,这是因为data()的getter表单确实读取了HTML5 data-属性,但是其setter表单既不创建也不更新它们。
弗雷德里克·哈米迪

嗯,那么它将数据保存在哪里?你能给我参考吗?我读到了这个((所有数据值然后都内部存储在jQuery中)。但是哪里???
gdoron支持Monica

3
@gdoron,数据保存在全局缓存中,并由一个通过expando属性与该元素相关联的ID进行键控。
弗雷德里克·哈米迪


8

您可以将JQuery UI与:data()选择器一起使用

选择具有存储在指定键下的数据的元素。

查看此jsfiddle示例

要获取所有匹配的元素,.data('myAttr')您可以使用

var matches = $(':data(myAttr)');

这对于具有data-属性的元素和具有使用来存储数据的元素都应该起作用,$.data()因为

从jQuery 1.4.3开始,HTML 5的data-属性将自动拉入jQuery的数据对象。

但这不是很好。检查此jsfiddle,您将看到第二次调用选择器时,它应该匹配2个元素,并且仅匹配一个。这是由于jquery-ui库中的“错误”。

这取自核心jquery-ui文件。

 $.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 ] );
        }
});

如您所见,它们正在使用$.data(elem, match)代替$(elem).data(match),这导致在请求具有data-属性的元素的情况下不会更新缓存。如果该元素已经过data()存储测试,则效果很好,但如果不成功,则不会包含在结果匹配中。

如果您想要的是仅将元素与您设置的数据信息进行匹配,那么这可能根本不是一个错误,但是如果您不想要,则有两个选择。

  1. 不要使用jquery-ui并扩展自己的伪选择器 $(:mydata(myAttr))

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

  2. 将jquery-ui与:data伪选择器[data-myAttr]一起使用,并加入选择结果以包括可能被跳过的结果

    var matches = $(':data(myAttr)', '[data-myAttr]')


这是我选择具有data- *属性的元素而又不知道实际id或data属性名称的问题的解决方案的一部分。我在其他地方找到了扩展jQuery的方法,但是这里+1表示代码片段以显示实际应用。其他人仅给出了足够的提示,但有时您需要显示如何使用所提供的信息。谢谢!:)
布兰登·埃利奥特

7
$('[data-myAttr]').each(function() {
       var element = $(this);
       // Do something with the element
});

2

选择我之前设置的元素 jquery.data();


问题是要查找具有特定键的所有元素,而不是任何数据。


尝试利用 jQuery.data()

$(".myClass").each(function(i){
    if( i % 2 == 0 ){
        $(this).data("myAttr",i + 1);                
    }
});
    
var res = $(".myClass").map(function(i) {
    console.log($(this).data("myAttr"));
    return $.data(this, "myAttr") !== undefined ? this : null
});    

console.log(res);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="myClass">1</div>
<div class="myClass">2</div>
<div class="myClass">3</div>
<div class="myClass">4</div>
<div class="myClass">5</div>

jsfiddle http://jsfiddle.net/xynZA/142/


感谢您的回答。问题是要查找具有特定键的所有元素,而不是任何数据。
Argiropoulos Stavros

@ArgiropoulosStavros是否要求返回具有html data-*属性set和jQuery.data()set的元素?
guest271314
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.