J'ai le champ suivant sur une vue MVC:
@Html.TextBoxFor(model => model.Course.Title, new { data_helptext = "Old Text" })</span>
Dans un fichier js séparé, je souhaite définir l' data-helptext
attribut sur une valeur de chaîne. Voici mon code:
alert($(targetField).data("helptext"));
$(targetField).data("helptext", "Testing 123");
L' alert()
appel fonctionne correctement, il affiche le texte "Ancien texte" dans une boîte de dialogue d'alerte. Cependant, l'appel pour définir l' data-helptext
attribut sur "Testing 123" ne fonctionne pas. "Ancien texte" est toujours la valeur actuelle de l'attribut.
Est-ce que j'utilise l'appel aux données () de manière incorrecte? J'ai recherché cela sur le Web et je ne vois pas ce que je fais de mal.
Voici le balisage HTML:
<input data-helptext="Old Text" id="Course_Title" name="Course.Title" type="text" value="" />
data-
attribut HTML5 personnalisé ?Réponses:
Il est mentionné dans la
.data()
documentationCela a également été abordé dans Pourquoi les modifications apportées à jQuery $ .fn.data () ne mettent-elles pas à jour les attributs html 5 data- * correspondants?
La démo de ma réponse originale ci-dessous ne semble plus fonctionner.
Réponse mise à jour
Encore une fois, à partir de la
.data()
documentationDonc pour
<div data-role="page"></div>
ce qui suit est vrai$('div').data('role') === 'page'
Je suis assez sûr que cela a
$('div').data('data-role')
fonctionné dans le passé, mais cela ne semble plus être le cas. J'ai créé une meilleure vitrine qui se connecte au HTML plutôt que d'avoir à ouvrir la console et j'ai ajouté un exemple supplémentaire de conversion des attributs de données multi-tirets en camelCase .Démo mise à jour (25/07/2015)
Voir également jQuery Data vs Attr?
HTML
JavaScript (jQuery 1.6.2+)
Démo plus ancienne
Réponse originale
Pour ce HTML:
et ce JavaScript (avec jQuery 1.6.2)
Voir la démo
En utilisant la console Chrome DevTools pour inspecter le DOM, le ne met pas à jour la valeur comme indiqué dans la console, mais le fait.
$('#foo').data('helptext', 'Testing 123');
$('#foo').attr('data-helptext', 'Testing 123');
la source
data('key', 'value')
méthode fait mettre à jour la valeur dans le cache jQuery , mais pour des raisons de performance (je suppose que la mutation DOM) le DOM lui - même est pas mis à jour..attr('key','value')
que vous l'ayez fait.data('key', 'value')
ou non, non? Cela me semble redondant, et j'ai du mal à imaginer un scénario où vous voudriez écrire dans le DOM en cache, mais pas dans le vrai DOM. Peut-être que je ne comprends pas le cache jQuery; Alors un visiteur verrait-il toutes les choses qui.data()
modifient sur son écran, ou non?J'avais de sérieux problèmes avec
Il ne définissait pas l'
data-property
attribut.Commencé à utiliser jQuery
.attr()
:pour définir la valeur et
pour récupérer la valeur.
Maintenant, ça marche!
la source
La réponse acceptée par @ andyb a un petit bogue. Suite à mon commentaire sur son post ci-dessus ...
Pour ce HTML:
Vous devez accéder à l'attribut comme ceci:
mais la méthode de données comme celle-ci:
Le correctif ci-dessus pour la méthode .data () empêchera "indéfini" et la valeur des données sera mise à jour (alors que le HTML ne le sera pas)
Le but de l'attribut "data" est de lier (ou de "lier") une valeur à l'élément. Très similaire à l'
onclick="alert('do_something')"
attribut, qui lie une action à l'élément ... le texte est inutile, vous voulez juste que l'action fonctionne quand ils cliquent sur l'élément.Une fois que les données ou l'action sont liées à l'élément, il n'est généralement * pas nécessaire de mettre à jour le HTML, uniquement les données ou la méthode, car c'est ce que votre application (JavaScript) utiliserait. En termes de performances, je ne vois pas pourquoi vous voudriez également mettre à jour le HTML de toute façon, personne ne voit l'attribut html (sauf dans Firebug ou d'autres consoles).
Vous voudrez peut-être y penser: le HTML (ainsi que les attributs) ne sont que du texte. Les données, fonctions, objets, etc. utilisés par JavaScript existent sur un plan séparé. Ce n'est que lorsque JavaScript est invité à le faire qu'il lira ou mettra à jour le texte HTML, mais toutes les données et fonctionnalités que vous créez avec JavaScript agissent de manière totalement distincte du texte / attributs HTML que vous voyez dans votre console Firebug (ou autre).
* Je mets l'accent sur généralement parce que si vous avez un cas où vous avez besoin de préserver et d'exporter du HTML (par exemple une sorte d'éditeur de texte prenant en charge les micro-formats / données) où le HTML se chargera à nouveau sur une autre page, alors peut-être que vous avez besoin du HTML mis à jour aussi.
la source
data
inattr('data-helptext'
fait la différence, là où la réponse acceptée et celles avec beaucoup de votes ne fonctionnent pas. +1Cela m'est arrivé de la même manière. Il se trouve que
vous donne un objet non inscriptible. Je l'ai résolu en utilisant:
Et à partir de là,
data
était un objet JS standard et inscriptible.la source
$.extend...
, vous pouvez utiliserdata
comme vous s'il vous plaît:,data.name = 'Nico'; data.questionSolved = true;
etconsole.log(data)
affichera ces propriétés nouvellement ajoutéesPour citer un devis:
.data()
- Documentation jQueryNotez que cette limitation (franchement étrange ) n'est réservée qu'à l'utilisation de
.data()
.La solution? Utilisez
.attr
plutôt.Bien sûr, plusieurs d'entre vous peuvent se sentir mal à l'aise de ne pas utiliser sa méthode dédiée. Considérez le scénario suivant:
Bon sens - Pourquoi changeraient-ils un attribut déjà établi comme ça? Imaginez simplement
class
commencer à renommer le groupe etid
en identifiant . Internet se briserait.Et même dans ce cas, Javascript lui-même a la capacité de résoudre ce problème - Et bien sûr, malgré sa fameuse incompatibilité avec HTML, REGEX (et une variété de méthodes similaires) pourrait rapidement renommer vos attributs en ce nouveau `` standard '' mythique.
TL; DR
la source
Comme mentionné, la
.data()
méthode ne définira pas réellement la valeur de l'data-
attribut, ni ne lira les valeurs mises à jour si ledata-
attribut change.Ma solution était d'étendre jQuery avec une
.realData()
méthode qui correspond en fait à la valeur actuelle de l'attribut:REMARQUE: Bien sûr, vous pouvez simplement utiliser
.attr()
, mais d'après mon expérience, la plupart des développeurs (aka moi) font l'erreur de visualiser.attr()
et d'.data()
être interchangeables, et souvent de substituer l'un à l'autre sans réfléchir. Cela peut fonctionner la plupart du temps, mais c'est un excellent moyen d'introduire des bogues, en particulier lorsqu'il s'agit de toute sorte de liaison de données dynamique. Donc, en utilisant.realData()
, je peux être plus explicite sur le comportement prévu.la source
Avait le même problème. Puisque vous pouvez toujours obtenir des données en utilisant la méthode .data (), il vous suffit de trouver un moyen d'écrire dans les éléments. C'est la méthode d'aide que j'utilise. Comme la plupart des gens l'ont dit, vous devrez utiliser .attr. Je le fais remplacer tout _ par - comme je le sais. Je ne connais aucun autre personnage qu'il remplace ... mais je n'ai pas fait de recherche là-dessus.
MODIFIER: 01/05/2017
J'ai trouvé qu'il y avait encore des cas où vous ne pouviez pas obtenir les données correctes à l'aide de méthodes intégrées, donc ce que j'utilise maintenant est la suivante:
la source