Quelle est la différence d'utilisation entre $.data
et $.attr
lors de l'utilisation data-someAttribute
?
Ma compréhension est que $.data
c'est stocké dans jQuery $.cache
, pas dans le DOM. Par conséquent, si je souhaite utiliser $.cache
pour le stockage de données, je dois utiliser $.data
. Si je veux ajouter des attributs de données HTML5, je devrais utiliser $.attr("data-attribute", "myCoolValue")
.
attr()
peut entraîner des fuites de mémoire (au moins dans IE), tandis que l'utilisationdata()
est sûre. Il fait allusion à cela dans sa réponse même s'il ne le dit pas explicitement. Plus d'informations sur les documents jQuery (voir les "Notes supplémentaires"): api.jquery.com/attrdata-someAttribute
n'est pas valide; selon les spécifications, seuls les minuscules sont autorisés. Vous rencontrerez une myriade de problèmes étranges en utilisant des caractères majuscules.Réponses:
Si vous transmettez des données à un élément DOM à partir du serveur, vous devez définir les données sur l'élément:
Les données sont ensuite accessibles via
.data()
jQuery:Cependant, lorsque vous stockez des données sur un nœud DOM dans jQuery à l' aide de données, les variables sont stockées sur l' objet nœud . Il s'agit de prendre en charge des objets et des références complexes, car le stockage des données sur l' élément de nœud en tant qu'attribut n'acceptera que les valeurs de chaîne.
Poursuivant mon exemple d'en haut:En outre, la convention de dénomination des attributs de données a un peu de "gotcha" caché:
HTML: JS:La clé coupée fonctionnera toujours:
HTML: JS:Cependant, l'objet renvoyé par
.data()
n'aura pas la clé coupée:C'est pour cette raison que je suggère d'éviter la clé coupée en javascript.
Pour HTML, continuez à utiliser le formulaire avec trait d'union. Les attributs HTML sont censés être automatiquement mis en minuscules ASCII , donc
<div data-foobar></div>
,<DIV DATA-FOOBAR></DIV>
et<dIv DaTa-FoObAr></DiV>
sont censés être traités comme identiques, mais pour une meilleure compatibilité, la forme minuscule doit être préférée.La
HTML: JS:.data()
méthode effectuera également une conversion automatique de base si la valeur correspond à un modèle reconnu:Cette capacité de diffusion automatique est très pratique pour instancier des widgets et des plugins:
Si vous devez absolument avoir la valeur d'origine sous forme de chaîne, vous devrez utiliser
HTML: JS:.attr()
:C'était un exemple artificiel. Pour stocker les valeurs de couleur, j'avais l'habitude d'utiliser la notation hexadécimale numérique (c'est-à-dire 0xABC123), mais il convient de noter que l' hex a été mal analysé dans les versions de jQuery avant 1.7.2 , et n'est plus analysé dans un à
Number
partir de jQuery 1.8 rc 1.jQuery 1.8 rc 1 a changé le comportement de la coulée automatique . Avant, tout format qui était une représentation valide d'un
HTML: JS:Number
était converti enNumber
. Désormais, les valeurs numériques ne sont converties automatiquement que si leur représentation reste la même. Ceci est mieux illustré par un exemple.Si vous prévoyez d'utiliser d'autres syntaxes numériques pour accéder aux valeurs numériques, assurez-vous de convertir la valeur en une
JS (suite):Number
première, comme avec un unaire+
opérateur .la source
.data()
n'aura pas le formulaire avec trait d'union, donc$('#bar').data('foo-bar-baz')
cela fonctionnera, mais$('#bar').data()['foo-bar-baz']
pas. C'est pour cette raison que je suggère aux gens d'éviter d'utiliser le formulaire avec trait d'union.La principale différence entre les deux est où il est stocké et comment il est accessible.
$.fn.attr
stocke les informations directement sur l'élément dans des attributs qui sont publiquement visibles lors de l'inspection, et qui sont également disponibles à partir de l'API native de l'élément.$.fn.data
stocke les informations dans un endroit ridiculement obscur . Il est situé dans une variable fermée sur locale appeléedata_user
qui est une instance d'une fonction définie localement Data. Cette variable n'est pas accessible directement depuis l'extérieur de jQuery.Ensemble de données avec
attr()
$(element).attr('data-name')
element.getAttribute('data-name')
,data-name
également accessible à partir$(element).data(name)
etelement.dataset['name']
etelement.dataset.name
Ensemble de données avec
.data()
.data(name)
.attr()
ou ailleursla source
.attr()
la voie à suivre, si par la suite vous souhaitez utiliser les données comme sélecteur (.data()
ne sera pas trouvé; voir codepen.io/anon/pen/EvawPV?editors=1011 )Vous pouvez utiliser l'
data-*
attribut pour incorporer des données personnalisées. ledata-*
attributs nous permettent d'intégrer des attributs de données personnalisés sur tous les éléments HTML.jQuery
.data()
méthode vous permet d'obtenir / définir des données de tout type sur des éléments DOM d'une manière qui est à l'abri des références circulaires et donc des fuites de mémoire..attr()
Méthode jQuery get / set valeur d'attribut uniquement pour le premier élément de l'ensemble correspondant.Exemple:
la source