jQuery how to find an element based on a data-attribute value?
我有以下场景:
1 | var el = 'li'; |
页面上有5个
我现在需要找到映射到
到目前为止,我的尝试都没有成功,尝试构建与当前幻灯片匹配的选择器:
1 | $('ul').find(el+[data-slide=+current+]); |
不匹配/返回任何东西......
我无法对
关于我缺少的任何想法?
您必须将
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 +"']"); |
我希望这可能会更好
谢谢
此选择器
1 2 3 4 5 | <ul> <li data-slide="item"> </li> </ul> |
虽然这个
回到他原来的问题,关于如何在不事先知道元素类型的情况下完成这项工作,以下是:
1 | $(ContainerNode).find(el.nodeName +"[data-slide='" + current +"']"); |