使用 HTML5 自定义数据属性的 jQuery 选择器

IT技术 javascript jquery jquery-selectors custom-data-attribute
2021-01-29 15:39:35

我想知道哪些选择器可用于 HTML5 附带的这些数据属性。

以这段HTML为例:

<ul data-group="Companies">
  <li data-company="Microsoft"></li>
  <li data-company="Google"></li>
  <li data-company ="Facebook"></li>
</ul>

是否有选择器可以获取:

  • 与所有元素data-company="Microsoft"下方"Companies"
  • 与所有元素data-company!="Microsoft"下方"Companies"
  • 在其他情况下,是否可以使用其他选择器,例如“包含、小于、大于等......”。
4个回答
$("ul[data-group='Companies'] li[data-company='Microsoft']") //Get all elements with data-company="Microsoft" below "Companies"

$("ul[data-group='Companies'] li:not([data-company='Microsoft'])") //get all elements with data-company!="Microsoft" below "Companies"

查看jQuery Selectors :contains 是一个选择器

这是关于:contains 选择器的信息

如果数据是通过 .data('something',value) 设置的,这会起作用吗?在附加值时,这通常不会创建实际属性。我知道 OP 在属性方面非常具体,但我认为如果其他人对此选择器有问题,我会提高认识。
2021-03-13 15:39:35
@gwho $('#element').data('something')
2021-03-18 15:39:35
有没有办法在不输入data调用的情况下获取数据属性值
2021-03-21 15:39:35
@AaronLS 不,它没有(至少不是旧版本的 jQuery,例如 1.4.4)-您需要设置数据.attr('data-something', 'value')以查看 HTML 中的更新。根据stackoverflow.com/questions/6827810/...
2021-03-24 15:39:35
这行得通吗?$('div[data-col="1"][data-row="2"]') 这会选择 data-col 等于 1 且 data-row 等于 2 的 div,还是会选择其中任何一个?
2021-03-30 15:39:35

jQuery UI有一个也可以使用:data()选择器似乎1.7.0 版以来一直存在

你可以这样使用它:

获取具有data-company属性的所有元素

var companyElements = $("ul:data(group) li:data(company)");

获取data-company等于的所有元素Microsoft

var microsoft = $("ul:data(group) li:data(company)")
                    .filter(function () {
                        return $(this).data("company") == "Microsoft";
                    });

获取data-company不等于的所有元素Microsoft

var notMicrosoft = $("ul:data(group) li:data(company)")
                       .filter(function () {
                           return $(this).data("company") != "Microsoft";
                       });

等等...

:data()选择器的一个警告是您必须通过代码设置data才能选择它。这意味着要使上述工作正常,在 HTML 中定义是不够的。你必须首先这样做:data

$("li").first().data("company", "Microsoft");

这适用于您可能以$(...).data("datakey", "value")这种或类似方式使用的单页应用程序

^你的意思是他的警告提到了选择器。
2021-03-13 15:39:35
@FacebookAnswers 您使用的是:data()选择器还是.data()方法?
2021-03-15 15:39:35
我明白你的意思了。我正在使用该方法,而您的警告是指该方法。
2021-03-22 15:39:35
我不明白你的警告。这对我来说很好用,我没有对 js 中的数据进行其他引用。$('#id').text($('#mydatasource').data('empty')); 这将使用#mydatasource 元素上的数据空标记的内容填充#id 元素。
2021-04-04 15:39:35
奇怪,现在它似乎可以在 Jquery 3.3.1 中工作:jsfiddle.net/kai_noack/q6nzLs20/1
2021-04-07 15:39:35

jsFiddle Demo

jQuery 提供了几个选择器(完整列表),以使您正在寻找的查询工作。解决您的问题“在其他情况下是否可以使用其他选择器,如“包含、小于、大于等......”。您还可以使用包含、开头和结尾来查看这些 html5 数据属性。查看上面的完整列表以查看您的所有选项。

上面已经介绍了基本查询,使用John Hartsock答案将是获取每个数据公司元素或获取除 Microsoft(或任何其他版本的:not之外的每个元素的最佳选择

为了将其扩展到您正在寻找的其他点,我们可以使用多个元选择器。首先,如果您要进行多个查询,最好缓存父选择。

var group = $('ul[data-group="Companies"]');

接下来,我们可以在这个集合中寻找以 G 开头的公司

var google = $('[data-company^="G"]',group);//google

或者可能包含“软”这个词的公司

var microsoft = $('[data-company*="soft"]',group);//microsoft

也可以获取数据属性结尾匹配的元素

var facebook = $('[data-company$="book"]',group);//facebook

//stored selector
var group = $('ul[data-group="Companies"]');

//data-company starts with G
var google = $('[data-company^="G"]',group).css('color','green');

//data-company contains soft
var microsoft = $('[data-company*="soft"]',group).css('color','blue');

//data-company ends with book
var facebook = $('[data-company$="book"]',group).css('color','pink');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul data-group="Companies">
  <li data-company="Microsoft">Microsoft</li>
  <li data-company="Google">Google</li>
  <li data-company ="Facebook">Facebook</li>
</ul>

纯/原版 JS 解决方案此处的工作示例

// All elements with data-company="Microsoft" below "Companies"
let a = document.querySelectorAll("[data-group='Companies'] [data-company='Microsoft']"); 

// All elements with data-company!="Microsoft" below "Companies"
let b = document.querySelectorAll("[data-group='Companies'] :not([data-company='Microsoft'])"); 

querySelectorAll 中,您必须使用有效的CSS 选择器(当前为Level3

jQuery 和 Pure JS 的速度测试(2018.06.29):在 Chrome 67.0.3396.99(64 位)、Safari 11.0.3 (13604.5.6)、Firefox 59.0.2 (64) 上的 MacOs High Sierra 10.13.3 上进行测试-少量)。下面的屏幕截图显示了最快浏览器 (Safari) 的结果:

在此处输入图片说明

PureJS 在 Chrome 上比 jQuery 快 12%,在 Firefox 上快 21%,在 Safari 上快 25%。有趣的是,Chrome 的速度为每秒 1890 万次操作,Firefox 26M,Safari 160.9M(!)。

所以赢家是 PureJS,最快的浏览器是Safari(比 Chrome 快 8 倍以上!)

在这里你可以在你的机器上进行测试:https : //jsperf.com/js-selectors-x