value jQuery como encontrar um elemento com base em um valor de atributo de dados?




set id jquery (8)

Eu tenho o seguinte cenário:

var el = 'li';

e há 5 <li> na página, cada um com um atributo data-slide=number (número sendo 1,2,3,4,5 respectivamente) .

Agora preciso encontrar o número do slide atualmente ativo que é mapeado para var current = $('ul').data(current); e é atualizado em cada alteração de slide.

Até agora, minhas tentativas não tiveram sucesso, tentando construir o seletor que corresponderia ao slide atual:

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

não corresponde / retorna nada…

O motivo pelo qual não posso codificar a parte li é que essa é uma variável acessível ao usuário que pode ser alterada para um elemento diferente, se necessário, portanto, nem sempre é um li .

Alguma idéia do que estou perdendo?



Eu enfrentei o mesmo problema ao buscar elementos usando o atributo jQuery e data- *.

então, para sua referência, o código mais curto está aqui:

Este é o meu código HTML:

<section data-js="carousel"></section>
<section></section>
<section></section>
<section data-js="carousel"></section>

Este é o meu seletor de jQuery:

$('section[data-js="carousel"]');
// this will return array of the section elements which has data-js="carousel" attribute.

Eu melhorei a share para jQuery.

Onde a extensão anterior pesquisou em um par de valores-chave, com essa extensão, você também pode procurar a presença de um atributo de dados, independentemente de seu valor.

(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);

Uso:

$('<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>

Ou o violino: http://jsfiddle.net/PTqmE/46/


Sem JQuery, ES6

document.querySelectorAll(`[data-slide='${current}']`);

Eu sei que a questão é sobre o JQuery, mas os leitores podem querer um método JS puro.


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

Espero que isso funcione melhor

obrigado


Este seletor $("ul [data-slide='" + current +"']"); vai trabalhar para a seguinte estrutura:

<ul><li data-slide="item"></li></ul>  

Enquanto este $("ul[data-slide='" + current +"']"); vai trabalhar para:

<ul data-slide="item"><li></li></ul>


Voltando à sua pergunta original, sobre como fazer isso funcionar sem conhecer o tipo de elemento antecipadamente, o seguinte faz isto:

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

Você tem que injetar o valor da current em um seletor Attribute Equals :

$("ul").find(`[data-slide='${current}']`)

Para ambientes JavaScript mais antigos (ES5 e anteriores):

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




custom-data-attribute