Quelle est la différence d'utilisation entre $.data
et $.attr
lors de l'utilisation de data-someAttribute
?
Je crois comprendre que $.data
est stocké dans $.cache
de jQuery, et non dans le DOM. Par conséquent, si je veux 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")
.
Si vous transmettez des données à un élément DOM à partir du serveur, vous devez définir les données sur l'élément:
<a id="foo" data-foo="bar" href="#">foo!</a>
Les données peuvent ensuite être consultées à l'aide de .data()
dans jQuery:
console.log( $('#foo').data('foo') );
//outputs "bar"
Toutefois, 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 . Cela permet de gérer des objets et des références complexes, car l'enregistrement des données sur l'élément node en tant qu'attribut ne prend en charge que les valeurs de chaîne.
En continuant mon exemple ci-dessus:$('#foo').data('foo', 'baz');
console.log( $('#foo').attr('data-foo') );
//outputs "bar" as the attribute was never changed
console.log( $('#foo').data('foo') );
//outputs "baz" as the value has been updated on the object
En outre, la convention de dénomination pour les attributs de données a un peu un "gotcha" caché:
HTML:<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
JS:console.log( $('#bar').data('fooBarBaz') );
//outputs "fizz-buzz" as hyphens are automatically camelCase'd
La clé avec trait d'union fonctionnera toujours:
HTML:<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
JS:console.log( $('#bar').data('foo-bar-baz') );
//still outputs "fizz-buzz"
Cependant, l'objet renvoyé par .data()
n'aura pas la clé composée comme un trait d'union:
$('#bar').data().fooBarBaz; //works
$('#bar').data()['fooBarBaz']; //works
$('#bar').data()['foo-bar-baz']; //does not work
C'est pour cette raison que je suggère d'éviter la clé avec trait d'union en javascript.
Pour HTML, continuez à utiliser la forme avec un trait d'union. les attributs HTML sont supposés être automatiquement en minuscules , donc <div data-foobar></div>
, <DIV DATA-FOOBAR></DIV>
et <dIv DaTa-FoObAr></DiV>
sont supposés doivent être considérés comme identiques, mais pour une compatibilité optimale, la forme minuscule doit être préférée.
La méthode .data()
effectuera également une conversion automatique de base si la valeur correspond à un modèle reconnu:
<a id="foo"
href="#"
data-str="bar"
data-bool="true"
data-num="15"
data-json='{"fizz":["buzz"]}'>foo!</a>
JS:$('#foo').data('str'); //`"bar"`
$('#foo').data('bool'); //`true`
$('#foo').data('num'); //`15`
$('#foo').data('json'); //`{fizz:['buzz']}`
Cette capacité de diffusion automatique est très pratique pour instancier des widgets et des plugins:
$('.widget').each(function () {
$(this).widget($(this).data());
//-or-
$(this).widget($(this).data('widget'));
});
Si vous devez absolument avoir la valeur d'origine en tant que chaîne, vous devrez alors utiliser .attr()
:
<a id="foo" href="#" data-color="ABC123"></a>
<a id="bar" href="#" data-color="654321"></a>
JS:$('#foo').data('color').length; //6
$('#bar').data('color').length; //undefined, length isn't a property of numbers
$('#foo').attr('data-color').length; //6
$('#bar').attr('data-color').length; //6
C'était un exemple artificiel. Pour stocker les valeurs de couleur, j’utilisais auparavant la notation numérique hexadécimale (c’est-à-dire 0xABC123), mais il convient de noter que hexa a été analysé de manière incorrecte dans les versions jQuery antérieures à la version 1.7.2 et n’est plus analysé dans un fichier Number
à partir de jQuery 1.8 rc 1.
jQuery 1.8 rc 1 a modifié le comportement de la diffusion automatique . Auparavant, tout format représentant correctement Number
était converti en Number
. 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.
<a id="foo"
href="#"
data-int="1000"
data-decimal="1000.00"
data-scientific="1e3"
data-hex="0x03e8">foo!</a>
JS: // pre 1.8 post 1.8
$('#foo').data('int'); // 1000 1000
$('#foo').data('decimal'); // 1000 "1000.00"
$('#foo').data('scientific'); // 1000 "1e3"
$('#foo').data('hex'); // 1000 "0x03e8"
Si vous envisagez d'utiliser d'autres syntaxes numériques pour accéder aux valeurs numériques, veillez à convertir cette valeur en un fichier Number
, par exemple avec un opérateur unaire +
.
+$('#foo').data('hex'); // 1000
La principale différence entre les deux réside dans le lieu de stockage et les modalités d'accès.
$.fn.attr
stocke les informations directement sur l'élément dans des attributs qui sont visibles publiquement 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 ridiculement obscur lieu. Il se trouve dans une variable locale fermée appelée _data_user
_, qui est une instance d'une fonction définie localement Data. Cette variable n'est pas accessible directement de l'extérieur de jQuery.
Jeu de données avec attr()
$(element).attr('data-name')
element.getAttribute('data-name')
,data-name
_ également accessible à partir de $(element).data(name)
et _element.dataset['name']
_ et _element.dataset.name
_ Jeu de données avec .data()
.data(name)
.attr()
ou ailleursVous pouvez utiliser l'attribut data-*
pour incorporer des données personnalisées. Les attributs data-*
nous permettent d'intégrer des attributs de données personnalisés à tous les éléments HTML.
la méthode jQuery .data()
vous permet d'obtenir/de définir des données de tout type sur des éléments DOM de manière à éviter les références circulaires et donc les fuites de mémoire.
jQuery .attr()
méthode get/set valeur d'attribut uniquement pour le premier élément de l'ensemble correspondant.
Exemple:
<span id="test" title="foo" data-kind="primary">foo</span>
$("#test").attr("title");
$("#test").attr("data-kind");
$("#test").data("kind");
$("#test").data("value", "bar");