1110

我有以下情况:

var el = 'li';

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

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

到目前为止,我的尝试一直不成功,试图构建与当前幻灯片匹配的选择器:

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

不匹配/返回任何东西……</p>

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

关于我所缺少的任何想法?

4

9 回答 9

1646

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

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

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

$("ul").find("[data-slide='" + current + "']"); 
于 2010-11-16T06:30:48.540 回答
528

如果您不想输入所有内容,这里有一个更短的按数据属性查询的方法:

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

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

于 2012-03-03T23:08:50.137 回答
241

使用 [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

您可以改用它:

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

$('<b>').data('x', 1).filterByData('x', 1).length
> 1
于 2013-03-27T03:59:15.680 回答
63

没有 JQuery,ES6

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

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

于 2018-06-04T20:50:00.663 回答
39

我改进了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);

用法:

$('<b>').data('x', 1).filterByData('x', 1).length    // output: 1
$('<b>').data('x', 1).filterByData('x').length       // output: 1

// 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 />");
}
#bPratik {
  font-family: monospace;
}
<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>

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

于 2014-03-05T21:21:47.193 回答
36

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

因此,供您参考,最短的代码在这里:

这是我的 HTML 代码:

<section data-js="carousel"></section>
<section></section>
<section></section>
<section data-js="carousel"></section>

这是我的 jQuery 选择器:

$('section[data-js="carousel"]');
// this will return array of the section elements which has data-js="carousel" attribute.
于 2013-10-22T12:39:32.010 回答
24

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

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

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

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

于 2016-09-30T15:08:24.190 回答
23
$("ul").find("li[data-slide='" + current + "']");

我希望这可能会更好

谢谢

于 2016-07-12T06:26:00.223 回答
15

回到他最初的问题,关于如何在事先不知道元素类型的情况下进行这项工作,以下是这样做的:

$(ContainerNode).find(el.nodeName + "[data-slide='" + current + "']");
于 2012-11-09T23:32:37.267 回答