【问题标题】:jQuery selectors on custom data attributes using HTML5使用 HTML5 自定义数据属性的 jQuery 选择器
【发布时间】:2011-05-07 23:39:28
【问题描述】:

我想知道哪些选择器可用于 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" 的所有元素
  • 在其他情况下,是否可以使用其他选择器,例如“包含、小于、大于等...”。

【问题讨论】:

标签: javascript jquery jquery-selectors custom-data-attribute


【解决方案1】:

一件事是什么

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

但你可以发明你的选择器:

function a() {
    inner= $("ul[data-group='Companies']");
    h = // get first child of inner([ 0])
    var ret = [] 

    while (h.nextSibling()) {
        if (h.Company == "Microsoft") {
            ret.push(h)
        };
        h = h.nextSibling();
    }
    return ret
}

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以在help center找到更多关于如何写好答案的信息。
【解决方案2】:

Pure/vanilla JS 解决方案(工作示例here

// 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 selector(当前为Level3

速度测试 (2018.06.29) 用于 jQuery 和 Pure JS:测试在 MacOs High Sierra 10.13.3 上 Chrome 67.0.3396.99(64 位)、Safari 11.0.3 (13604.5) 上执行.6)、火狐 59.0.2(64 位)。下面的屏幕截图显示了最快浏览器(Safari)的结果:

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

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

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

【讨论】:

    【解决方案3】:

    jsFiddle Demo

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

    上面已经介绍了基本查询,使用 John Hartsockanswer 将是获取每个 data-company 元素或获取除 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>

    【讨论】:

      【解决方案4】:

      jQuery UI 有一个 :data() selector 也可以使用。它似乎从Version 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") 的单页应用程序。

      【讨论】:

      • 我不明白你的警告。这对我来说很好,我没有对 js 中的数据进行其他引用。 $('#id').text($('#mydatasource').data('empty'));这将使用 #mydatasource 元素上的 data-empty 标记的内容填充 #id 元素。
      • @FacebookAnswers 您使用的是:data() 选择器还是.data() 方法?
      • ^你的意思是他的警告提到了选择器。
      • 奇怪,现在它似乎可以在 Jquery 3.3.1 中使用:jsfiddle.net/kai_noack/q6nzLs20/1
      • @Avatar :data() 选择器来自 jQueryUI,它不在 jQuery 中。这就是您收到该语法错误的原因。在小提琴中,您使用的是数据属性选择器ul[data-group],它是一个 CSS 选择器,它适用于 jQuery(以及在接受的答案中使用的那个)。
      【解决方案5】:
      $("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 selector的信息

      【讨论】:

      • 这行得通吗? $('div[data-col="1"][data-row="2"]') 这会选择 data-col 等于 1 且 data-row 等于 2 的 div,还是会选择其中任何一个?
      • 如果数据是通过 .data('something',value) 设置的,这会起作用吗?附加值时,这通常不会创建实际属性。我知道 OP 在属性方面非常具体,但我想我会提高意识,以防其他人对此选择器有问题。
      • @AaronLS 不,它不会(至少在旧版本的 jQuery 中不会,例如 1.4.4) - 您需要使用 .attr('data-something', 'value') 设置数据以查看 HTML 中的更新。根据stackoverflow.com/questions/6827810/…
      • 没有在调用中不输入data就可以获取数据属性值的方法吗?
      • @gwho $('#element').data('something')
      猜你喜欢
      • 1970-01-01
      • 2014-03-25
      • 2013-08-20
      • 2014-04-06
      • 2013-09-06
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多