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

jQuery how to find an element based on a data-attribute value?

我有以下场景:

1
var el = 'li';

页面上有5个

  • ,每个都有一个data-slide=number属性(数字分别为1,2,3,4,5)。

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

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

    1
    $('ul').find(el+[data-slide=+current+]);

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

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

    关于我缺少的任何想法?


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

    1
    $("ul").find(`[data-slide='${current}']`)

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

    1
    $("ul").find("[data-slide='" + current +"']");


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

    1
    $("ul[data-slide='" + current +"']");

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


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

    1
    2
    3
    4
    5
    6
    7
    8
    $('<b data-x="1">'  ).is('[data-x=1]') // this works
    > true

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

    $('').attr('data-x', 1).is('[data-x=1]') // this is the workaround
    > true

    您可以使用此代替:

    1
    2
    3
    4
    5
    6
    7
    8
    $.fn.filterByData = function(prop, val) {
        return this.filter(
            function() { return $(this).data(prop)==val; }
        );
    }

    $('').data('x', 1).filterByData('x', 1).length
    > 1

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    (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);

    用法:

    1
    2
    $('').data('x', 1).filterByData('x', 1).length    // output: 1
    $('').data('x', 1).filterByData('x').length       // output: 1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    // 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 />");
    }
    1
    2
    3
    #bPratik {
      font-family: monospace;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">


      Setup
      Data added inline :: data-prop="val"
      Data added inline :: data-prop="val"
      Data added inline :: data-prop="diffval"
      Data added inline :: data-test="val"
      Data will be added via jQuery
      Output
     

      <hr />
      <button onclick="extractData()">Reveal</button>

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


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

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

    这是我的HTML代码:

    1
    2
    3
    4
    <section data-js="carousel"></section>
    <section></section>
    <section></section>
    <section data-js="carousel"></section>

    这是我的jQuery选择器:

    1
    2
    $('section[data-js="carousel"]');
    // this will return array of the section elements which has data-js="carousel" attribute.

    没有JQuery,ES6

    1
    document.querySelectorAll(`[data-slide='${current}']`);

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


    1
    $("ul").find("li[data-slide='" + current +"']");

    我希望这可能会更好

    谢谢


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

    1
    2
    3
    4
    5
    <ul>
    <li data-slide="item">
    </li>

    </ul>

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


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

    1
    $(ContainerNode).find(el.nodeName +"[data-slide='" + current +"']");