Existe-t-il une méthode simple et directe pour sélectionner les éléments en fonction de leur data
attribut? Par exemple, sélectionnez toutes les ancres dont l'attribut de données est nommé et customerID
dont la valeur est 22
.
J'hésite un peu à utiliser rel
ou d'autres attributs pour stocker de telles informations, mais je trouve qu'il est beaucoup plus difficile de sélectionner un élément en fonction des données qui y sont stockées.
jquery
html
custom-data-attribute
Hazem Salama
la source
la source
$('*[data-customerID]')
vous pouvez l'utiliser avec par exemple$('*[data-customerID]').each( function() { ... });
Réponses:
Vous devriez pouvoir omettre le
*
, mais si je me souviens bien, selon la version de jQuery que vous utilisez, cela pourrait donner des résultats erronés.Notez que pour la compatibilité avec l'API Selectors (
document.querySelector{,all}
), les guillemets autour de la valeur d'attribut (22
) ne peuvent pas être omis dans ce cas .De plus, si vous travaillez beaucoup avec des attributs de données dans vos scripts jQuery, vous voudrez peut-être envisager d'utiliser le plug-in d'attributs de données personnalisés HTML5 . Cela vous permet d'écrire du code encore plus lisible en utilisant
.dataAttr('foo')
, et entraîne une taille de fichier plus petite après minification (par rapport à l'utilisation.attr('data-foo')
).la source
.data()
auxdata-*
attributs personnalisés par défaut, ce qui rend ce plugin redondant. Il peut néanmoins être utilisé pour les anciennes versions de jQuery. »$('[data-customerID]')
.data()
), non?Pour les personnes recherchant sur Google et souhaitant des règles plus générales sur la sélection avec des attributs de données:
$("[data-test]")
sélectionne tout élément simple a l'attribut de données (peu importe la valeur de l'attribut). Comprenant:$('[data-test~="foo"]')
sélectionnera tout élément où l'attribut data contientfoo
mais ne doit pas être exact, tel que:$('[data-test="the_exact_value"]')
sélectionnera tout élément dont la valeur exacte de l'attribut de données estthe_exact_value
, par exemple:mais non
la source
~=
correspond aux mots séparés par des espaces alors qu'il*=
correspond à n'importe quelle sous-chaîne.^
caractère?$('[data-test^=foo]')
dans ce cas, vous sélectionnez tout ce qui commence par foo, tel que<div data-test="foo_exact_value">
ou<div data-test="food">
non<div data-test="seafoo">
L'utilisation
$('[data-whatever="myvalue"]')
sélectionnera n'importe quoi avec des attributs html, mais dans les nouvelles requêtes, il semble que si vous utilisez$(...).data(...)
pour attacher des données, il utilise un navigateur magique et n'affecte pas le html, il n'est donc pas découvert par.find
comme indiqué dans la réponse précédente .Vérifier (testé avec 1.7.2+) (voir aussi violon ): (mis à jour pour être plus complet)
la source
.filter
ici$item.attr('data-id', 10);
Je n'ai pas vu de réponse JavaScript sans jQuery. J'espère que cela aide quelqu'un.
Info:
attributs de données
.querySelectorAll ();
la source
Pour sélectionner toutes les ancres avec l'attribut data
data-customerID==22
, vous devez inclure lea
pour limiter la portée de la recherche à ce type d'élément uniquement. La recherche d'attributs de données dans une grande boucle ou à haute fréquence lorsqu'il y a de nombreux éléments sur la page peut entraîner des problèmes de performances.la source
Exemples JS natifs
Obtenez NodeList des éléments
html:
<div data-id="container"></div>
Obtenez le premier élément
html:
<div id="container"></div>
Cibler une collection de nœuds qui renvoie une liste de nœuds
html:
Obtenir des éléments basés sur plusieurs valeurs de données (OR)
html:
Obtenir des éléments basés sur des valeurs de données combinées (AND)
html:
Obtenez les éléments où commence la valeur
la source
via la méthode Jquery filter ():
http://jsfiddle.net/9n4e1agn/1/
HTML:
JavaScript:
la source
La construction comme celle-ci:
$('[data-XXX=111]')
ne fonctionne pas dans Safari 8.0 .Si vous les données ensemble d' attributs de cette façon:
$('div').data('XXX', 111)
il ne fonctionne que si vous les données directement dans l'attribut Entité DOM comme ceci:$('div').attr('data-XXX', 111)
.Je pense que c'est parce que l'équipe jQuery a optimisé le garbage collector pour éviter les fuites de mémoire et les opérations lourdes sur la reconstruction DOM sur chaque attribut de données de changement.
la source
Pour que cela fonctionne dans Chrome, la valeur ne doit pas avoir une autre paire de guillemets.
Cela ne fonctionne, par exemple, que comme ceci:
la source
$('[data-action=setStatus]').removeClass('disabled')
Il est parfois souhaitable de filtrer les éléments selon qu'ils ont des éléments de données qui leur sont attachés par programme (c'est-à-dire pas via les attributs dom):
Ce qui précède fonctionne mais n'est pas très lisible. Une meilleure approche consiste à utiliser un pseudo-sélecteur pour tester ce genre de chose:
Nous pouvons maintenant refactoriser la déclaration d'origine en quelque chose de plus fluide et lisible:
la source
Juste pour compléter toutes les réponses avec certaines fonctionnalités du «standard de vie» - À l'heure actuelle (à l'ère html5), il est possible de le faire sans bibliothèque tierce:
document.querySelector('[data-answer="42"],[type="submit"]')
document.querySelectorAll('[data-answer="42"],[type="submit"]')
[data-answer="42"],[type="submit"]
[data-answer]
ouinput[type]
la source