Je stocke des données en utilisant l' data-
approche dans une balise HTML comme ceci:
<td><"button class='delete' data-imagename='"+results[i].name+"'>Delete"</button></td>
Je récupère ensuite les données dans un rappel comme celui-ci:
$(this).data('imagename');
Cela fonctionne très bien. Ce sur quoi je suis coincé, c'est d'essayer de sauvegarder l'objet au lieu d'une seule de ses propriétés. J'ai essayé de faire ceci:
<td><button class='delete' data-image='"+results[i]+"'>Delete</button></td>
Ensuite, j'ai essayé d'accéder à la propriété name comme ceci:
var imageObj = $(this).data('image');
console.log('Image name: '+imageObj.name);
Le journal me dit undefined
. Il semble donc que je puisse stocker des chaînes simples dans les data-
attributs mais je ne peux pas stocker d'objets JSON ...
J'ai également essayé d'utiliser ce gamin de syntaxe sans succès:
<div data-foobar='{"foo":"bar"}'></div>
Une idée sur la façon de stocker un objet réel dans la balise HTML en utilisant l' data-
approche?
htmlspecialchars(json_encode($e))
(idée de Nicolas répondre aux commentaires).jsonObject
il être stringifié? edit: au cas où cela aiderait quelqu'un d'autre, je viens de trouver la réponse à cette question ici: stackoverflow.com/a/42864472"You don't need to stringify objects to store them using jQuery.data()"
En fait, votre dernier exemple:
semble bien fonctionner (voir http://jsfiddle.net/GlauberRocha/Q6kKU/ ).
La bonne chose est que la chaîne de l'attribut data est automatiquement convertie en objet JavaScript. Je ne vois aucun inconvénient à cette approche, bien au contraire! Un attribut suffit pour stocker tout un ensemble de données, prêtes à être utilisées en JavaScript via les propriétés d'objet.
(Remarque: pour que les attributs de données reçoivent automatiquement le type Object plutôt que String, vous devez faire attention à écrire du JSON valide, en particulier à mettre les noms de clés entre guillemets).
la source
$('div').data('foobar').foo
. api.jquery.com/data'
ne fonctionne pas pour moi pendant que je suisecho json_encode($array)
de php. Puisqu'il terminera la valeur d'attribut par un guillemet simple. Toute suggestion, sauf échapper manuellement au guillemet simple du tableau.?&quot;
(entité HTML à double échappement ) pour qu'il soit rendu dans votre source comme & quot ;. Mais peut-être que c'est le genre de chose que vous voulez éviter lorsque vous dites "échapper manuellement aux guillemets simples" ...Voilà comment cela a fonctionné pour moi.
Objet
Ensemble
Encode l'objet stringifié avec encodeURIComponent () et défini comme attribut:
Avoir
Pour obtenir la valeur en tant qu'objet, analysez la valeur décodée, avec decodeURIComponent () , valeur d'attribut:
la source
De nombreux problèmes liés au stockage des données sérialisées peuvent être résolus en convertissant la chaîne sérialisée en base64 .
Une chaîne base64 peut être acceptée à peu près n'importe où sans problème.
Jeter un coup d'œil à:
Convertissez vers / depuis si nécessaire.
la source
window.btoa
JSON.parse
avant de pouvoir utiliser le résultat comme objet.Pour moi, cela fonctionne comme ça, car je dois le stocker dans un modèle ...
la source
$('body').data('myData', { h: "hello", w: "world" })
_____________________________________________________________________________________________ vous obtiendrez votre objet JSON par$('body').data().myData
'<div data-dataObj=\''+ JSON.stringify(dataObj) +'\'></div>'
. Ce sont tous des guillemets simples, le début et la fin sont simplement échappés, donc ce serait la même chose que d'avoir'{"some":"thing"}'
replace()
aborde la possibilité que des guillemets simples apparaissent dans les données json, ce qui est tout à fait possible.L'astuce pour moi était d' ajouter des guillemets doubles autour des clés et des valeurs . Si vous utilisez une fonction PHP comme
json_encode
cela vous donnera une chaîne encodée JSON et une idée de comment encoder correctement la vôtre.jQuery('#elm-id').data('datakey')
retournera un objet de la chaîne, si la chaîne est correctement codée en json.Selon la documentation jQuery: ( http://api.jquery.com/jquery.parsejson/ )
La transmission d'une chaîne JSON mal formée entraîne la levée d'une exception JavaScript. Par exemple, les éléments suivants sont toutes des chaînes JSON non valides:
"{test: 1}"
(test
n'a pas de guillemets doubles autour)."{'test': 1}"
('test'
utilise des guillemets simples au lieu de guillemets doubles)."'test'"
('test'
utilise des guillemets simples au lieu de guillemets doubles).".1"
(un nombre doit commencer par un chiffre;"0.1"
serait valide)."undefined"
(undefined
ne peut pas être représenté dans une chaîne JSONnull
, mais peut l'être)."NaN"
(NaN
ne peut pas être représenté dans une chaîne JSON; la représentation directe d'Infinity est également nla source
Combinez l'utilisation de
window.btoa
etwindow.atob
avecJSON.stringify
etJSON.parse
.- Cela fonctionne pour les chaînes contenant des guillemets simples
Encodage des données:
Décodage des données:
Voici un exemple de la manière dont les données sont construites et décodées ultérieurement avec l'événement click.
Construisez le html et encodez les données:
Décodez les données dans le gestionnaire d'événements click:
la source
L'utilisation de la syntaxe documentée jquery .data (obj) vous permet de stocker un objet sur l'élément DOM. L'inspection de l'élément n'affichera pas l'
data-
attribut car aucune clé n'est spécifiée pour la valeur de l'objet. Cependant, les données dans l'objet peuvent être référencées par clé avec.data("foo")
ou l'objet entier peut être renvoyé avec.data()
.Donc, en supposant que vous configuriez une boucle et
result[i] = { name: "image_name" }
:la source
Pour une raison quelconque, la réponse acceptée ne fonctionnait pour moi que si elle était utilisée une fois sur la page, mais dans mon cas, j'essayais de sauvegarder des données sur de nombreux éléments de la page et les données étaient en quelque sorte perdues sur tous sauf le premier élément.
Au lieu de cela, j'ai fini par écrire les données sur le dom et les analyser en cas de besoin. Peut-être que c'est moins efficace, mais cela a bien fonctionné pour mon objectif parce que je suis vraiment en train de prototyper des données et je n'écris pas cela pour la production.
Pour enregistrer les données que j'ai utilisées:
Relire ensuite les données équivaut à la réponse acceptée, à savoir:
Cela faisait également apparaître les données dans le dom si je devais inspecter l'élément avec le débogueur de Chrome.
la source
.data()
fonctionne parfaitement dans la plupart des cas. La seule fois où j'ai eu un problème, c'était lorsque la chaîne JSON elle-même avait un guillemet simple. Je ne pouvais pas trouver de moyen facile de surmonter cela, alors j'ai eu recours à cette approche (j'utilise Coldfusion comme langage serveur):la source
Pour mémoire, j'ai trouvé que le code suivant fonctionne. Il vous permet de récupérer le tableau à partir de la balise de données, de pousser un nouvel élément et de le stocker de nouveau dans la balise de données au format JSON correct. Le même code peut donc être utilisé à nouveau pour ajouter d'autres éléments au tableau si vous le souhaitez. J'ai trouvé que
$('#my-data-div').attr('data-namesarray', names_string);
stockait correctement le tableau, mais$('#my-data-div').data('namesarray', names_string);
ne fonctionnait pas.la source
});
la source
Ce code fonctionne bien pour moi.
Encoder des données avec btoa
Et puis décoder avec atob
la source