我有以下情形:

var el = 'li';


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

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

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

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


不匹配/不返回任何内容...

我可以不对li部分进行硬编码是,这是一个用户可访问的变量,可以根据需要将其更改为其他元素,因此它不一定总是li

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

评论

您确定在.find(el + [data-slide = + current +]);是您编写的代码?似乎您错过了对[[data-slide]“的引用

那就是帮助我选择所有数据属性(无论值如何)的原因:$('* [data-slide]')您可以将其与例如$('* [data-slide]')。each(function(){...});

#1 楼

您必须将current的值注入到“属性等于”选择器中:

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


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

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


评论


@Jannis,您可以执行$(“ ul”)。find(el +“ [data-slide ='” + current +“']”);。

–FrédéricHamidi
2010年11月16日,9:13

@ c00lryguy,jQuery UI定义了一个,周围有独立的实现。似乎将其添加到jQuery Core的尝试被拒绝了。两次。

–FrédéricHamidi
2012年7月8日在7:31



这个类似的帖子的答案有一个过滤功能的例子

–drzaus
2012年7月26日在16:08

我担心如果通过jQuery .data(...)函数添加数据将无法正常工作,因为这并不总是呈现属性,因此soemtimes使用浏览器特定的存储机制。我希望jQuery核心具有数据特定选择器的另一个原因。

– AaronLS
2012年10月31日18:43

请注意,它不适用于使用$('#element')。data('some-att-name',value);设置数据的元素;但仅适用于具有硬编码属性的用户。我遇到了这个问题,并通过直接写入属性$('#element')。attr('data-some-att-name',value);来使其工作设置数据。

–毛巾
13-10-28在16:55

#2 楼

如果您不想输入所有内容,这是通过数据属性查询的一种较短方法:

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


FYI: .padolsey.com / javascript / a-better-data-selector-for-jquery /

评论


对于那些关心您的人,给定结构
,此答案的选择器将返回undefined,因此在用户的情况下不起作用。这个答案将对结构
起作用。虽然我理解为什么它由于简洁而流行,但从技术上讲这是一个错误的答案。 jsfiddle.net/py5p2abL/1

–akousmata
2014年12月4日15:15



不要忘记将其视为数组。使用[0]访问找到的第一个元素。

– Aminah Nuraini
16年6月1日在17:06

奇怪的副作用...当.find(“ [data-attrib ='value']”)不起作用时,此方法将元素与data属性匹配。我不知道值是否是jQuery添加的数据属性...

–错误
16年7月22日在20:22



这并不奇怪,因为这两个答案做了2件事。 $ .find专门查找该元素的后代,但是在选择器字符串中使用过滤器语法只会过滤结果。

–菲尔
16-10-5在11:51

#3 楼

当使用[data-x = ...]搜索时,请注意,它不适用于jQuery.data(..)设置器:请改用它:

$('<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很出色;但是,这是对那里的复制粘贴的警告...您只需要$('')。filterByData('x',1)即可找到具有data-x =“ 1”的标签。如果您复制粘贴.data(x,1)部分...,则将在过滤之前将data-x设置为“ 1”。

– WEBjuju
3月17日下午16:50

#4 楼

没有JQuery,ES6

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


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

#5 楼

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

前一个扩展在键-值对上进行搜索,使用此扩展,您还可以搜索data属性的存在,而不管其值如何。

(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/

#6 楼

在使用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.


#7 楼

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


我希望这样可以更好地工作

感谢

#8 楼

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

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


同时此$("ul[data-slide='" + current +"']");适用于:

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

#9 楼

回到他最初的问题,关于如何在不事先知道元素类型的情况下进行此工作,请执行以下操作:

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