Élément filtrant basé sur.de données() clé/valeur

Disons que j'ai 4 éléments div avec la classe .navlink, qui, lorsqu'ils sont cliqués, utilisent .data() pour définir une clé appelée 'selected', à une valeur de true:

$('.navlink')click(function() { $(this).data('selected', true); })

Chaque fois qu'un nouveau .navlink est cliqué, je voudrais stocker précédemment sélectionné navlink pour plus tard manipulation. Existe-t-il un moyen rapide et facile de sélectionner un élément en fonction de ce qui a été stocké en utilisant .data()?

Il ne semble pas y avoir de jQuery :filters qui correspondent à la facture, et j'ai essayé ce qui suit (dans le même événement de clic), mais pour une raison quelconque, cela ne fonctionne pas:

var $previous = $('.navlink').filter( 
    function() { $(this).data("selected") == true }
);

Je sais qu'il existe d'autres moyens d'y parvenir, mais en ce moment je suis surtout curieux de savoir si cela peut être fait via .data().

106
demandé sur Brian Tompsett - 汤莱恩 2009-06-18 00:57:57

5 réponses

Votre filtre fonctionnerait, mais vous devez retourner true sur les objets correspondants dans la fonction passée au filtre pour qu'il les récupère.

var $previous = $('.navlink').filter(function() { 
  return $(this).data("selected") == true 
});
174
répondu BaroqueBobcat 2009-06-17 21:06:27

Juste pour Info, vous Pouvez filtrer les données avec jquery (cette question est assez ancienne, et jQuery a évolué depuis, il est donc juste d'écrire cette solution aussi):

$('.navlink[data-selected="true"]');

Ou, mieux (pour les performances):

$('.navlink').filter('[data-selected="true"]');

Ou, si vous voulez obtenir tous les éléments de data-selected set:

$('[data-selected]')

Notez que cette méthode ne fonctionnera qu'avec les données définies via les attributs html. Si vous définissez ou modifiez des données avec l'appel .data(), cette méthode ne fonctionnera plus.

121
répondu StefanoP 2015-01-22 09:22:13

, Nous pouvons faire un plugin assez facilement:

$.fn.filterData = function(key, value) {
    return this.filter(function() {
        return $(this).data(key) == value;
    });
};

Utilisation (vérification d'un bouton radio):

$('input[name=location_id]').filterData('my-data','data-val').prop('checked',true);
13
répondu mpen 2018-05-09 20:39:57

Deux choses que j'ai remarquées (elles peuvent être des erreurs quand vous l'avez écrit).

  1. Vous avez manqué un point dans le premier exemple ( $('.navlink').click )
  2. pour que le filtre fonctionne, vous devez renvoyer une valeur ( return $(this).data("selected")==true )
8
répondu Thomas 2013-02-25 23:16:28

Sonne comme plus de travail que sa valeur.

1) Pourquoi ne pas simplement avoir une seule variable JavaScript qui stocke une référence à l'objet element\jQuery actuellement sélectionné.

2) Pourquoi ne pas ajouter une classe à l'élément actuellement sélectionné. Ensuite, vous pouvez interroger le DOM pour le ".active " classe ou quelque chose.

-1
répondu Bryan Migliorisi 2009-06-17 21:01:44