Étant donné un élément HTML arbitraire avec zéro ou plusieurs data-*
attributs, comment récupérer une liste de paires clé-valeur pour les données.
Par exemple, étant donné ceci:
<div id='prod' data-id='10' data-cat='toy' data-cid='42'>blah</div>
J'aimerais pouvoir récupérer par programme ceci:
{ "id":10, "cat":"toy", "cid":42 }
En utilisant jQuery (v1.4.3), accéder aux bits de données individuels en utilisant $.data()
est simple si les clés sont connues à l'avance, mais il n'est pas évident de savoir comment le faire avec des ensembles de données arbitraires.
Je recherche une solution jQuery «simple» s'il en existe une, mais cela ne me dérangerait pas une approche de niveau inférieur autrement. J'ai essayé d'analyser $('#prod').attributes
mais mon manque de javascript-fu me laisse tomber.
mettre à jour
customdata fait ce dont j'ai besoin. Cependant, inclure un plugin jQuery juste pour une fraction de ses fonctionnalités semblait être une exagération.
Regarder la source m'a aidé à corriger mon propre code (et a amélioré mon javascript-fu).
Voici la solution que j'ai trouvée:
function getDataAttributes(node) {
var d = {},
re_dataAttr = /^data\-(.+)$/;
$.each(node.get(0).attributes, function(index, attr) {
if (re_dataAttr.test(attr.nodeName)) {
var key = attr.nodeName.match(re_dataAttr)[1];
d[key] = attr.nodeValue;
}
});
return d;
}
mise à jour 2
Comme démontré dans la réponse acceptée, la solution est triviale avec jQuery (> = 1.4.4). $('#prod').data()
renverrait les données requises dict.
la source
Réponses:
En fait, si vous travaillez avec jQuery, à partir de la version
1.4.31.4.4 (en raison du bogue mentionné dans les commentaires ci-dessous), lesdata-*
attributs sont pris en charge via.data()
:La
jQuery.fn.data
fonction retournera tous lesdata-
attributs à l'intérieur d'un objet sous forme de paires clé-valeur, la clé étant la partie du nom d'attribut aprèsdata-
et la valeur étant la valeur de cet attribut après avoir été convertie en suivant les règles énoncées ci-dessus.J'ai également créé une démo simple si cela ne vous convainc pas: http://jsfiddle.net/yijiang/WVfSg/
la source
!jQuery.isNaN( data ) ? parseFloat( data ) : ...
). J'avais des numéros de série de produits dans mon attribut, tels quedata-serial="00071134"
jQuery fusionné dans un nombre71134
, me forçant à revenir au moins élégant.attr('data-serial')
(pas une option dans votre cas). J'ai vu des questions sur SO qui ont exprimé des frustrations similaires.data()
, j'essaierai d'en creuser une ...$.data()
renvoie également tout ce que vous avez stocké en utilisant$.data(key, value)
. Si vous voulez vraiment vérifier si quelque chose est réellement stocké dans le balisage en tant qu'attribut data- *, cette méthode n'est peut-être pas le meilleur choix.Une solution JavaScript pure devrait également être proposée, car la solution n'est pas difficile:
Cela donne un tableau d'objets attribut, qui ont
name
etvalue
propriétés:Modifier: pour aller plus loin, vous pouvez obtenir un dictionnaire en itérant les attributs et en remplissant un objet de données:
Vous pouvez alors accéder à la valeur de, par exemple,
data-my-value="2"
commedata.myValue
;jsfiddle.net/3KFYf/33
Modifier: si vous souhaitez définir des attributs de données sur votre élément par programmation à partir d'un objet, vous pouvez:
jsfiddle.net/3KFYf/34
EDIT: Si vous utilisez babel ou TypeScript, ou codez uniquement pour les navigateurs es6, c'est un bon endroit pour utiliser les fonctions fléchées es6 et raccourcir un peu le code:
la source
-
caractère comme le fait jQuery mais la réponse modifiée le fait.JSON.stringify()
formatage JSON intégré.el.getAttribute("data-foo")
. J'ai mis à jour ma réponse pour montrer comment vous pouvez définir des attributs de données en fonction d'un objet.Regardez ici :
Si le navigateur prend également en charge l'API JavaScript HTML5, vous devriez pouvoir obtenir les données avec:
ou
Oh, mais j'ai aussi lu:
C'est à partir de mai 2010.
Si vous utilisez quand même jQuery, vous voudrez peut-être jeter un coup d'œil au plugin customdata . Je n'ai cependant aucune expérience avec cela.
la source
$("#my").customdata()
devrait vous donner{method: "delete", remote: "true"}
... donc cela devrait fonctionner.Comme mentionné ci-dessus, les navigateurs modernes ont l' API The HTMLElement.dataset .
Cette API vous donne un DOMStringMap , et vous pouvez récupérer la liste des
data-*
attributs en faisant simplement:vous pouvez également récupérer un tableau avec les
data-
noms de clé de la propriété commeou mappez ses valeurs par
et comme ça, vous pouvez les itérer et les utiliser sans avoir besoin de filtrer entre tous les attributs de l'élément comme nous devions le faire auparavant .
la source
ou convertissez
gilly3
l'excellente réponse en une méthode jQuery:En utilisant
$('.foo').info()
:;la source
Vous devriez obtenir les données via les attributs de l'ensemble de données
dataset est un outil utile pour obtenir l'attribut de données
la source
this.dataset
ne fonctionne pas encore sur tous les navigateurs. Il existe cependant un plugin jquery qui fournit cette fonctionnalité.Vous pouvez simplement parcourir les attributs de données comme n'importe quel autre objet pour obtenir des clés et des valeurs, voici comment le faire avec
$.each
:la source
J'utilise chacun imbriqué - pour moi, c'est la solution la plus simple (Facile à contrôler / modifier "ce que vous faites avec les valeurs - dans mon exemple, les attributs de données de sortie comme
ul-list
) (Code Jquery)Codepen: https://codepen.io/ezra_siton/pen/GRgRwNw?editors=1111
la source
Une façon de trouver tous les attributs de données consiste à utiliser
element.attributes
. En utilisant.attributes
, vous pouvez parcourir tous les attributs d'élément, en filtrant les éléments qui incluent la chaîne "data-".la source