我有如下场景: css
var el = 'li';
页面上有5个<li>
,每一个都有一个data-slide=number
属性(数字分别为1,2,3,4,5) 。 html
我如今须要找到当前活动的幻灯片编号,该编号映射到var current = $('ul').data(current);
并在每次幻灯片更改时更新。 node
到目前为止,个人尝试都没有成功,尝试构建与当前幻灯片匹配的选择器: jquery
$('ul').find(el+[data-slide=+current+]);
不匹配/返回任何东西...... ajax
我没法对li
部分进行硬编码的缘由是,这是一个用户可访问的变量,若是须要能够更改成不一样的元素,所以它可能并不老是一个li
。 api
关于我缺乏的任何想法? app
回到他原来的问题,关于如何在不事先知道元素类型的状况下完成这项工做,如下是: dom
$(ContainerNode).find(el.nodeName + "[data-slide='" + current + "']");
使用[data-x = ...]进行搜索时,请注意, 它不适用于jQuery.data(..)setter : ide
$('<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
您可使用此代替: ui
$.fn.filterByData = function(prop, val) { return this.filter( function() { return $(this).data(prop)==val; } ); } $('<b>').data('x', 1).filterByData('x', 1).length > 1
使用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.
我改进了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/
$("ul").find("li[data-slide='" + current + "']");
我但愿这可能会更好
谢谢