jQuery как найти элемент на основе значения атрибута данных?
У меня есть следующий сценарий:
var el = 'li';
и на странице есть 5
data-slide=number
(число составляет 1,2,3,4,5 соответственно) . - Выбрать элемент по точному соответствию его содержимому
- Как определить, работает ли браузер Chrome с помощью jQuery?
- Как изменить css display none или заблокировать свойство с помощью JQuery?
- Каков самый быстрый способ выбора элементов-потомков в jQuery?
- jQuery: содержит селектор для поиска нескольких строк
Теперь мне нужно найти var current = $('ul').data(current);
активный номер слайда, который отображается на var current = $('ul').data(current);
и обновляется при каждом изменении слайдов.
Пока мои попытки не увенчались успехом, пытаясь построить селектор, который будет соответствовать текущему слайду:
$('ul').find(el+[data-slide=+current+]);
не соответствует / не возвращает ничего …
Причина, по которой я не могу жестко кодировать часть li
заключается в том, что это переменная, доступная пользователю, которая может быть изменена на другой элемент, если это необходимо, поэтому это может быть не всегда.
Любые идеи о том, что мне не хватает?
- Найти все элементы на основе ids с помощью regex в селекторе jQuery
- Какие селектора CSS3 действительно поддерживают jQuery, например: nth-last-child ()?
- Выделение селектора jQuery
- Что такое fastest children () или find () в jQuery?
- : nth-of-type () в jQuery / Sizzle?
- jQuery получить все div, которые не имеют атрибута classа
- jQuery scrollTop не работает в Chrome, но работает в Firefox
- Подстановочные знаки в селекторах jQuery
Вы должны ввести значение current
в селектор равных атрибутов :
$("ul").find(`[data-slide='${current}']`)
Для более старых сред JavaScript (ES5 и ранее):
$("ul").find("[data-slide='" + current + "']");
в случае, если вы не хотите вводить все это, вот более короткий способ запроса по атрибуту data:
$("ul[data-slide='" + current +"']");
FYI: http://james.padolsey.com/javascript/a-better-data-selector-for-jquery/
При поиске с помощью [data-x = …], обратите внимание, что это не работает с jQuery.data (..) setter :
$('' ).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
Вы можете использовать это вместо этого:
$.fn.filterByData = function(prop, val) { return this.filter( function() { return $(this).data(prop)==val; } ); } $('').data('x', 1).filterByData('x', 1).length > 1
Я улучшил добавление filterByData для psobmbm в 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);
Применение:
$('').data('x', 1).filterByData('x', 1).length // output: 1 $('').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 + "
"); }
#bPratik { font-family: monospace; }
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
Я столкнулся с такой же проблемой при извлечении элементов с использованием атрибута jQuery и data- *.
поэтому для вашей справки кратчайший код здесь:
Это мой код HTML:
Это мой селектор jQuery:
$('section[data-js="carousel"]'); // this will return array of the section elements which has data-js="carousel" attribute.
Возвращаясь к его первоначальному вопросу, о том, как сделать эту работу, не зная тип элемента заранее, следующее:
$(ContainerNode).find(el.nodeName + "[data-slide='" + current + "']");
$("ul").find("li[data-slide='" + current + "']");
Я надеюсь, что это может работать лучше
благодаря
Этот селектор $("ul [data-slide='" + current +"']");
будет работать для следующей структуры:
Хотя этот $("ul[data-slide='" + current +"']");
будет работать для:
Без JQuery, ES6
document.querySelectorAll(`[data-slide='${current}']`);
Я знаю, что речь идет о JQuery, но читателям может понадобиться чистый JS-метод.