我有以下情况:
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() { ... });
一起使用
您必须将 current
的值注入 Attribute Equals 选择器:
$("ul").find(`[data-slide='${current}']`)
对于较旧的 JavaScript 环境(ES5 和更早版本):
$("ul").find("[data-slide='" + current + "']");
如果您不想输入所有内容,这里有一个更短的按数据属性查询的方法:
$("ul[data-slide='" + current +"']");
仅供参考:http://james.padolsey.com/javascript/a-better-data-selector-for-jquery/
<ul><li data-slide="item"></li></ul>
,此答案的选择器将返回未定义,因此在用户的情况下它不起作用。这个答案将适用于结构 <ul data-slide="item"><li></li></ul>
虽然我理解为什么它由于简洁而流行,但从技术上讲它是一个不正确的答案。 jsfiddle.net/py5p2abL/1
使用 [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
没有 JQuery,ES6
document.querySelectorAll(`[data-slide='${current}']`);
我知道这个问题是关于 JQuery 的,但读者可能想要一个纯 JS 方法。
我将 psycho brm's filterByData extension 改进为 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
// 测试数据 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'); }); // 实际的扩展 (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); //只是为了快速记录功能 log(txt) { if (window.console && console.log) { console.log(txt); //} else { // alert('你需要一个控制台来检查结果'); } $("#result").append(txt + "
"); } #bPratik { 字体系列:等宽; }
或者小提琴:http://jsfiddle.net/PTqmE/46/
我在使用 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.
此选择器 $("ul [data-slide='" + current +"']");
将适用于以下结构:
<ul><li data-slide="item"></li></ul>
虽然此 $("ul[data-slide='" + current +"']");
适用于:
<ul data-slide="item"><li></li></ul>
$("ul").find("li[data-slide='" + current + "']");
我希望这可能会更好
谢谢
回到他最初的问题,关于如何在事先不知道元素类型的情况下进行这项工作,以下是这样做的:
$(ContainerNode).find(el.nodeName + "[data-slide='" + current + "']");