Question jQuery comment trouver un élément basé sur une valeur d'attribut de données?


J'ai le scénario suivant:

var el = 'li';

et il y a 5 <li>est sur la page chacun avec un data-slide=number attribut (le nombre étant 1,2,3,4,5 respectivement).

Je dois maintenant trouver le numéro de diapositive actuellement actif qui est mappé var current = $('ul').data(current); et est mis à jour à chaque changement de diapositive.

Jusqu'à présent, mes essais ont échoué, essayant de construire le sélecteur qui correspondrait à la diapositive actuelle:

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

ne correspond pas / retourne quelque chose ...

La raison pour laquelle je ne peux pas coder en dur le li une partie est que c'est une variable accessible à l'utilisateur qui peut être changé en un élément différent si nécessaire, de sorte qu'il ne peut pas toujours être un li.

Des idées sur ce qui me manque?


824
2017-11-16 05:11


origine


Réponses:


Vous devez injecter la valeur de current dans un Attribut égal sélecteur:

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

Pour les environnements JavaScript plus anciens (ES5 et versions antérieures):

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

1225
2017-11-16 06:30



au cas où vous ne voudriez pas taper tout cela, voici un moyen plus court d'interroger par attribut de données:

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

FYI: http://james.padolsey.com/javascript/a-better-data-selector-for-jquery/


383
2018-03-03 23:08



Lorsque vous effectuez une recherche avec [data-x = ...], faites attention, cela ne fonctionne pas avec 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

Vous pouvez l'utiliser à la place:

$.fn.filterByData = function(prop, val) {
    return this.filter(
        function() { return $(this).data(prop)==val; }
    );
}

$('<b>').data('x', 1).filterByData('x', 1).length
> 1

204
2018-03-27 03:59



J'ai amélioré L'extension filterByData de psycho brm à jQuery.

Lorsque l'extension précédente est recherchée sur une paire clé-valeur, cette extension vous permet en outre de rechercher la présence d'un attribut de données, quelle que soit sa valeur.

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

Usage:

$('<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 le violon: http://jsfiddle.net/PTqmE/46/


35
2018-03-05 21:21



J'ai rencontré le même problème en récupérant des éléments en utilisant jQuery et data- * attribute.

donc pour votre référence le code le plus court est ici:

Ceci est mon code HTML:

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

C'est mon sélecteur jQuery:

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

22
2017-10-22 12:39



Pour revenir à sa question initiale, sur la façon de faire ce travail sans connaître le type d'élément à l'avance, ce qui suit:

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

11
2017-11-09 23:32



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

J'espère que cela fonctionnera mieux

Merci


11
2017-07-12 06:26