jQuery как найти элемент на основе значения атрибута данных?

У меня есть следующий сценарий:

var el = 'li'; 

и на странице есть 5

  • каждый с атрибутом data-slide=number (число составляет 1,2,3,4,5 соответственно) .

    Теперь мне нужно найти var current = $('ul').data(current); активный номер слайда, который отображается на var current = $('ul').data(current); и обновляется при каждом изменении слайдов.

    Пока мои попытки не увенчались успехом, пытаясь построить селектор, который будет соответствовать текущему слайду:

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

    не соответствует / не возвращает ничего …

    Причина, по которой я не могу жестко кодировать часть li заключается в том, что это переменная, доступная пользователю, которая может быть изменена на другой элемент, если это необходимо, поэтому это может быть не всегда.

    Любые идеи о том, что мне не хватает?

    Вы должны ввести значение 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-метод.

  • jQuery: исключить $ (this) из селектора
  • Как выбрать элементы, которые не имеют определенного дочернего элемента с JQuery
  • Разница между CSS-селектором и фильтром jQuery?
  • Есть ли jQuery-подобный CSS / HTML-селектор, который можно использовать в C #?
  • Тестирование, если флажок установлен с помощью jQuery
  • Является ли jQuery каким-либо кэшированием «селекторов»?
  • jQuery выбрать по classу VS выбрать по атрибуту
  • Как я могу получить идентификатор элемента с помощью jQuery?
  • addID в jQuery?
  • Как я могу получить соответствующий заголовок таблицы (th) из ячейки таблицы (td)?
  • Установите опцию выбора «selected», по значению
  • Давайте будем гением компьютера.