Jquery sélectionne tous les éléments qui ont $ jquery.data ()


Réponses:


98

Vous pourriez faire

$('[data-myAttr!=""]'); 

ceci sélectionne tous les éléments qui ont un attribut data-myAttrqui n'est pas égal à '' (il doit donc avoir été défini);

vous pouvez également utiliser filter ()

$('*').filter(function() {
    return $(this).data('myAttr') !== undefined;
});

67
Ou simplement:$('[data-myAttr]')
andlrc

4
J'ai pensé la même chose. Cela ne fonctionne pas comme prévu. voir cette DEMO
gdoron soutient Monica le

une fermeture 'est manquante dans le premier morceau de code (impossible de modifier la réponse directement)
Florent2

1
$ ('[données-monAttr! = ""]'); renverra les éléments qui ne lui sont pas affectés. Le commentaire de @NULL ne récupère que les éléments qui l'ont défini.
arleslie

6
FAUX! solution correcte: $ ('[data-myAttr]') - voir la réponse ci-dessous pour l'explication
BassMHL

74

La meilleure et simple façon de les sélectionner est:

$('[data-myAttr]')

Plus d'information:

J'ai testé beaucoup de choses.

L'utilisation $('[data-myAttr!=""]')ne fonctionne pas dans tous les cas. Parce que les éléments qui n'ont pas d' data-myAttrensemble auront leur data-myAttrégal à undefinedet $('[data-myAttr!=""]')les sélectionneront également, ce qui est incorrect.


3
Cela ne fonctionne qu'avec les attributs de données définis dans le balisage. Il ne fonctionne PAS avec les attributs de données définis via jQuery, voir jsfiddle.net/2p7h0Lj8/1
Sophivorus

19

Vous pouvez utiliser filter () :

var elements = $("*").filter(function() {
    return $(this).data("myAttr") !== undefined;
});

1
Était sur le point de publier ceci, voici un violon pour montrer que cela fonctionne: jsfiddle.net/gbHFZ/1
Rory McCrossan

1
Pourquoi le sélecteur d'attribut ne fait pas le travail? $('[data-myAttr]')?
gdoron soutient Monica le

6
@gdoron, c'est parce que data()la forme getter de la lecture lit effectivement les data-attributs HTML5 , mais sa forme setter ne les crée ni ne les met à jour.
Frédéric Hamidi le

ummm, alors où enregistre-t-il les données? pouvez-vous me donner une référence? J'ai lu ceci "(toutes les valeurs de données sont ensuite stockées en interne dans jQuery)". mais où???
gdoron soutient Monica le

3
@gdoron, les données sont conservées dans un cache global, saisi par un identifiant associé à l'élément via une propriété expando.
Frédéric Hamidi le


7

Vous pouvez utiliser l'interface utilisateur JQuery avec le sélecteur: data ()

Sélectionne les éléments dont les données sont stockées sous la clé spécifiée.

Vérifiez ce jsfiddle pour un exemple

Pour obtenir tous les éléments correspondants, .data('myAttr')vous pouvez utiliser

var matches = $(':data(myAttr)');

Cela devrait fonctionner à la fois pour les éléments avec des data-attributs et pour les éléments avec des données stockées en utilisant $.data()car

À partir de jQuery 1.4.3, les attributs de données HTML 5 seront automatiquement ajoutés à l'objet de données de jQuery.

Mais cela ne fonctionne pas très bien. Vérifiez ce jsfiddle et vous verrez que la deuxième fois que le sélecteur est appelé, il doit correspondre à 2 éléments et ne correspond qu'à un seul. Cela est dû à "un bogue" dans la bibliothèque jquery-ui.

Ceci est tiré du fichier jquery-ui principal.

 $.extend( $.expr[ ":" ], {
    data: $.expr.createPseudo ?
        $.expr.createPseudo(function( dataName ) {
            return function( elem ) {
                return !!$.data( elem, dataName );
            };
        }) :
        // support: jQuery <1.8
        function( elem, i, match ) {
            return !!$.data( elem, match[ 3 ] );
        }
});

Comme vous pouvez le voir, ils utilisent à la $.data(elem, match)place, $(elem).data(match)ce qui empêche la mise à jour du cache au cas où vous demanderiez des éléments avec des data-attributs. Si l'élément a été testé pourdata() stockage, cela fonctionne bien mais sinon, il ne sera pas inclus dans les correspondances résultantes.

Ce n'est peut-être pas du tout un bogue si vous voulez faire correspondre uniquement des éléments avec des informations de données définies par vous, mais sinon, vous avez deux options.

  1. N'utilisez pas jquery-ui et étendez votre propre pseudo-sélecteur $(:mydata(myAttr))

    $.extend($.expr[":"], {
       mydata: $.expr.createPseudo ?
       $.expr.createPseudo(function(dataName) {
          return function(elem) {
             return !!$(elem).data(dataName);
          };
       }) : function(elem, i, match) {
           return !!$(elem).data(match[3]);
       }
    });

  2. Utilisez jquery-ui avec le :datapseudosélecteur et joignez les résultats de la sélection [data-myAttr]pour inclure ceux qui pourraient être ignorés

    var matches = $(':data(myAttr)', '[data-myAttr]')


Cela faisait partie de la solution à mon problème de sélection d'éléments avec des attributs data- * sans connaître l'identifiant réel ou le nom d'attribut data. J'ai trouvé le moyen d'étendre jQuery pour le faire, ailleurs, mais +1 ici pour que l'extrait de code montre une application pratique. D'autres donnent juste assez pour donner un indice, mais parfois vous devez MONTRER comment UTILISER les informations fournies. Merci! :)
Brandon Elliott

7
$('[data-myAttr]').each(function() {
       var element = $(this);
       // Do something with the element
});

2

Sélectionnez les éléments avec lesquels j'ai précédemment défini jquery.data();


La question est de trouver tous les éléments avec une clé spécifique et non des données.


Essayez d'utiliser jQuery.data()

$(".myClass").each(function(i){
    if( i % 2 == 0 ){
        $(this).data("myAttr",i + 1);                
    }
});
    
var res = $(".myClass").map(function(i) {
    console.log($(this).data("myAttr"));
    return $.data(this, "myAttr") !== undefined ? this : null
});    

console.log(res);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="myClass">1</div>
<div class="myClass">2</div>
<div class="myClass">3</div>
<div class="myClass">4</div>
<div class="myClass">5</div>

jsfiddle http://jsfiddle.net/xynZA/142/


Merci pour la réponse. La question est de trouver tous les éléments avec une clé spécifique et non des données.
Argiropoulos Stavros

@ArgiropoulosStavros Est-il nécessaire de renvoyer des éléments dont l' html data-*attribut est défini, ainsi que jQuery.data()défini?
invité271314
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.