我有以下场景:

var el = 'li';

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

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

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

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

不匹配/返回任何东西…

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

你知道我错过了什么吗?


当前回答

我改进了精神病brm的filterByData扩展到jQuery。

前一个扩展在键值对上搜索,而使用这个扩展,您可以额外搜索数据属性的存在,而不管其值如何。

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

其他回答

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

我希望这可能会更好

谢谢

你必须将current的值注入到Attribute Equals选择器中:

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

对于较旧的JavaScript环境(ES5或更早):

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

我改进了精神病brm的filterByData扩展到jQuery。

前一个扩展在键值对上搜索,而使用这个扩展,您可以额外搜索数据属性的存在,而不管其值如何。

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

这个选择器(美元“ul(数据=”当前“+ +”“]”);适用于以下结构:

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

While this $("ul[data-slide='" + current +"']");适合:

<ul data-slide=“item”><li></li></ul>

没有JQuery, ES6

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

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