jQuery如何根据数据属性值查找元素?

Jan*_*nis 942 jquery jquery-selectors custom-data-attribute

我有以下场景:

var el = 'li';
Run Code Online (Sandbox Code Playgroud)

<li>页面上有5个,每个都有一个data-slide=number属性(数字分别为1,2,3,4,5).

我现在需要找到当前活动的幻灯片编号,该编号映射到var current = $('ul').data(current);每个幻灯片更改并更新.

到目前为止,我的尝试都没有成功,尝试构建与当前幻灯片匹配的选择器:

$('ul').find(el+[data-slide=+current+]);
Run Code Online (Sandbox Code Playgroud)

不匹配/返回任何东西......

我无法硬编码li部件的原因是,这是一个用户可访问的变量,如果需要可以更改为不同的元素,因此它可能并不总是一个li.

关于我缺少的任何想法?

Fré*_*idi 1401

您必须将值current注入Attribute Equals选择器:

$("ul").find(`[data-slide='${current}']`)
Run Code Online (Sandbox Code Playgroud)

对于较旧的JavaScript环境(ES5及更早版本):

$("ul").find("[data-slide='" + current + "']"); 
Run Code Online (Sandbox Code Playgroud)

  • 请注意,它不适用于使用$('#element')设置数据的元素.data('some-att-name',value); 但仅适用于具有硬编码属性的人.我有这个问题,并通过直接写$('#element')属性来设置数据.attr('data-some-att-name',value); (77认同)
  • 我担心如果通过jQuery .data(...)函数添加数据,这将无法工作,因为这并不总是呈现属性,因此soemtimes使用特定于浏览器的存储机制.我希望jQuery核心有一个特定于数据的选择器的另一个原因. (76认同)
  • @Jannis,你可以做`$("ul").find(el +"[data-slide ='"+ current +"']");`. (8认同)
  • @ c00lryguy,[jQuery UI](http://jqueryui.com/)定义了一个,并且有[独立实现](http://archive.plugins.jquery.com/project/dataSelector).似乎尝试将它添加到jQuery Core中[被拒绝](http://bugs.jquery.com/ticket/3586).[两次](http://bugs.jquery.com/ticket/9392). (7认同)
  • [这个答案](http://stackoverflow.com/a/7344459/1037948)在类似帖子上有一个过滤功能的例子 (6认同)
  • 供将来参考:情况就是这样,因为attr和prop是两个不同的东西.[链接](http://stackoverflow.com/a/5876747/1489912).选择器只能找到attr而.data()使用prop.将数据设置为属性或使用.each()等循环 (3认同)
  • 不错的,现在只是一个更普遍意义上的问题.虽然这对我的例子现在非常有效,但有没有办法可以把我的`el`变量带到这样的东西?或者只是`$("ul").find("+ el +"[data-slide ='"+ current +"']");`? (2认同)
  • @ mrbinky3000,一个属性选择器只匹配实际属性,所以我的答案中的代码不能匹配只调用`data("slide",number)`的元素(因为`data()`的setter形式*不*创建或更新`data -`属性).要找到这些元素,您必须使用`filter()`或其中一个提供`:data()`选择器的插件. (2认同)
  • @Frederic Hamidi - 你知道任何添加`:data()`选择器的插件吗? (2认同)

Kev*_*eus 441

如果你不想输入所有这些,这里有一个更简单的数据属性查询方式:

$("ul[data-slide='" + current +"']");
Run Code Online (Sandbox Code Playgroud)

仅供参考:http: //james.padolsey.com/javascript/a-better-data-selector-for-jquery/

  • 对于那些关心你的人,给定结构`<ul> <li data-slide ="item"> </ li> </ ul>`这个答案的选择器将返回undefined,因此在给定用户的情况下它不起作用.这个答案适用于结构`<ul data-slide ="item"> <li> </ li> </ ul>`虽然我理解为什么它的流行由于简洁,但从技术上来说这是一个错误的答案.http://jsfiddle.net/py5p2abL/1/ (26认同)
  • 不要忘记将其视为一个数组.使用`[0]`访问找到的第一个元素. (3认同)

psy*_*brm 221

使用[data-x = ...]进行搜索时,请注意,它不适用于jQuery.data(..)setter:

$('<b data-x="1">'  ).is('[data-x=1]') // this works
> true

$('<b>').data('x', 1).is('[data-x=1]') // this doesn't
> false

$('<b>').attr('data-x', 1).is('[data-x=1]') // this is the workaround
> true
Run Code Online (Sandbox Code Playgroud)

您可以使用此代替:

$.fn.filterByData = function(prop, val) {
    return this.filter(
        function() { return $(this).data(prop)==val; }
    );
}

$('<b>').data('x', 1).filterByData('x', 1).length
> 1
Run Code Online (Sandbox Code Playgroud)


bPr*_*tik 37

我改进了psycho brm对jQuery 的filterByData扩展.

如果前一个扩展名在一个键值对上搜索,则使用此扩展名,您还可以搜索数据属性的存在,而不管其值如何.

(function ($) {

    $.fn.filterByData = function (prop, val) {
        var $self = this;
        if (typeof val === 'undefined') {
            return $self.filter(
                function () { return typeof $(this).data(prop) !== 'undefined'; }
            );
        }
        return $self.filter(
            function () { return $(this).data(prop) == val; }
        );
    };

})(window.jQuery);
Run Code Online (Sandbox Code Playgroud)

用法:

$('<b>').data('x', 1).filterByData('x', 1).length    // output: 1
$('<b>').data('x', 1).filterByData('x').length       // output: 1
Run Code Online (Sandbox Code Playgroud)

// test data
function extractData() {
  log('data-prop=val ...... ' + $('div').filterByData('prop', 'val').length);
  log('data-prop .......... ' + $('div').filterByData('prop').length);
  log('data-random ........ ' + $('div').filterByData('random').length);
  log('data-test .......... ' + $('div').filterByData('test').length);
  log('data-test=anyval ... ' + $('div').filterByData('test', 'anyval').length);
}

$(document).ready(function() {
  $('#b5').data('test', 'anyval');
});

// the actual extension
(function($) {

  $.fn.filterByData = function(prop, val) {
    var $self = this;
    if (typeof val === 'undefined') {
      return $self.filter(

        function() {
          return typeof $(this).data(prop) !== 'undefined';
        });
    }
    return $self.filter(

      function() {
        return $(this).data(prop) == val;
      });
  };

})(window.jQuery);


//just to quickly log
function log(txt) {
  if (window.console && console.log) {
    console.log(txt);
    //} else {
    //  alert('You need a console to check the results');
  }
  $("#result").append(txt + "<br />");
}
Run Code Online (Sandbox Code Playgroud)
#bPratik {
  font-family: monospace;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div id="bPratik">
  <h2>Setup</h2>
  <div id="b1" data-prop="val">Data added inline :: data-prop="val"</div>
  <div id="b2" data-prop="val">Data added inline :: data-prop="val"</div>
  <div id="b3" data-prop="diffval">Data added inline :: data-prop="diffval"</div>
  <div id="b4" data-test="val">Data added inline :: data-test="val"</div>
  <div id="b5">Data will be added via jQuery</div>
  <h2>Output</h2>
  <div id="result"></div>

  <hr />
  <button onclick="extractData()">Reveal</button>
</div>
Run Code Online (Sandbox Code Playgroud)

或小提琴:http://jsfiddle.net/PTqmE/46/


小智 31

使用jQuery和data-*属性获取元素时遇到了同样的问题.

所以供您参考,最短的代码在这里:

这是我的HTML代码:

<section data-js="carousel"></section>
<section></section>
<section></section>
<section data-js="carousel"></section>
Run Code Online (Sandbox Code Playgroud)

这是我的jQuery选择器:

$('section[data-js="carousel"]');
// this will return array of the section elements which has data-js="carousel" attribute.
Run Code Online (Sandbox Code Playgroud)


rap*_*2-h 26

没有JQuery,ES6

document.querySelectorAll(`[data-slide='${current}']`);
Run Code Online (Sandbox Code Playgroud)

我知道问题是关于JQuery,但读者可能想要一个纯JS方法.


Jom*_*aul 15

$("ul").find("li[data-slide='" + current + "']");
Run Code Online (Sandbox Code Playgroud)

我希望这可能会更好

谢谢


Mat*_*ius 13

此选择器$("ul [data-slide='" + current +"']");适用于以下结构:

<ul><li data-slide="item"></li></ul>  
Run Code Online (Sandbox Code Playgroud)

虽然这$("ul[data-slide='" + current +"']");适用于:

<ul data-slide="item"><li></li></ul>


小智 11

回到他原来的问题,关于如何在不事先知道元素类型的情况下完成这项工作,以下是:

$(ContainerNode).find(el.nodeName + "[data-slide='" + current + "']");
Run Code Online (Sandbox Code Playgroud)