Magasin d'objet JSON dans les données de l'attribut HTML jQuery
Je suis le stockage de données à l'aide de la data-
approche dans une balise HTML comme ceci:
<td><"button class='delete' data-imagename='"+results[i].name+"'>Delete"</button></td>
Je suis puis récupérer les données dans un rappel comme ceci:
$(this).data('imagename');
Qui fonctionne très bien. Ce que je suis coincé à l'est d'essayer d'économiser de l'objet au lieu de simplement l'une des propriétés de l'il. J'ai essayé de faire ceci:
<td><button class='delete' data-image='"+results[i]+"'>Delete</button></td>
Puis j'ai essayé d'accéder à la propriété de nom comme ceci:
var imageObj = $(this).data('image');
console.log('Image name: '+imageObj.name);
Le log me dit undefined
. Donc il semble que je peux stocker des chaînes simples dans la data-
attributs, mais je ne peux pas stocker des objets JSON...
J'ai aussi essayé d'utiliser ce gamin de syntaxe, pas de chance:
<div data-foobar='{"foo":"bar"}'></div>
La moindre idée sur la façon de stocker un objet dans la balise HTML à l'aide de la data-
approche?
Vous devez vous connecter pour publier un commentaire.
au lieu de l'intégrer dans le texte qui vient d'utilisation
$('#myElement').data('key',jsonObject);
il ne sera pas effectivement être stockées dans le code html, mais si vous êtes à l'aide de jquery.de données, tout ce qui est abstrait de toute façon.
Pour obtenir le retour JSON ne pas l'analyser, il suffit d'appeler:
Si vous obtenez
[Object Object]
au lieu de direct JSON, d'accéder simplement à votre JSON par la clé de données:htmlspecialchars(json_encode($e))
(idée de Nicolas réponse les commentaires).En fait, votre dernier exemple:
semble bien fonctionner (voir http://jsfiddle.net/GlauberRocha/Q6kKU/).
La bonne chose est que la chaîne de caractères dans la base de données de l'attribut est automatiquement converti en un objet JavaScript. Je ne vois pas d'inconvénient dans cette approche, au contraire! Un attribut est suffisant pour stocker un ensemble de données, prêt à l'emploi dans le code JavaScript via les propriétés de l'objet.
(Note: pour les données d'attributs pour être automatiquement le type de l'Objet plutôt que de Chaîne, vous devez être attentif à écrire JSON valide, en particulier pour joindre les noms de clé en double guillemets).
$('div').data('foobar').foo
. api.jquery.com/datavar foobar = $('div').data('foobar')
), vous pouvez utiliser le supprimer opérateur de retirer un bien:delete foobar.foo
(oudelete foobar['foo']
), ou faire ce que vous voulez avec elle.'
ne fonctionne pas pour moi que jeecho json_encode($array)
à partir de php. Depuis qu'il mettra fin à la valeur de l'attribut par des guillemets simples. Toute suggestion, sauf s'échapper l'apostrophe manuellement à partir du tableau.?&quot;
(double échappement entité HTML) si elle est rendue dans votre source de ". Mais peut-être que c'est le genre de chose que vous voulez éviter quand vous dites "s'échapper l'apostrophe à la main"....data()
plus tard sur le champ renvoie l'objet de toutes les propriétés! Complètement oublié à ce sujet, des accessoires pour vous et Nicolas.C'est la façon dont il a travaillé pour moi.
Objet
Ensemble
Coder le stringified objet avec encodeURIComponent() et de définir comme attribut:
Obtenir
Pour obtenir la valeur d'un objet, d'analyser la décodé, avec decodeURIComponent(), la valeur de l'attribut:
Pour moi, il travail comme ça, comme j'ai besoin de le stocker dans le modèle...
$('body').data('myData', { h: "hello", w: "world" })
_____________________________________________________________________________________________ vous souhaitez obtenir votre objet JSON par$('body').data().myData
'<div data-dataObj=\''+ JSON.stringify(dataObj) +'\'></div>'
. Ceux sont tous les guillemets simples, le début et la fin sont juste échappé, donc ce serait la même chose que d'avoir'{"some":"thing"}'
Beaucoup de problèmes de stockage de données sérialisées peut être résolu par la conversion de la chaîne sérialisée à base64.
Base64 chaîne peuvent être acceptées à peu près n'importe où, sans chichi.
Prendre un coup d'oeil à:
La conversion, au besoin.
Le truc pour moi c'était de ajouter des guillemets autour des clés et des valeurs. Si vous utilisez une fonction php comme json_encode vous donnera une chaîne encodée json et une idée de comment propery encoder le vôtre.
jQuery('#orme-id').de données('datakey') retournera un objet de la chaîne, si la chaîne est correctement encodé en json.
Comme par jQuery documentation: (http://api.jquery.com/jquery.parsejson/)
En passant un mal formé chaîne JSON résultats dans un JavaScript exception levée. Par exemple, les éléments suivants sont tous valides chaînes JSON:
À l'aide de la documenté jquery .de données(obj) de la syntaxe vous permet de stocker un objet sur l'élément du DOM. L'inspection de l'élément ne sera pas le
data-
attribut parce qu'il n'y a pas spécifié de la valeur de l'objet. Toutefois, les données à l'intérieur de l'objet peut être référencée par la clé avec.data("foo")
ou la totalité de l'objet peut être renvoyé à.data()
.Donc, en supposant que vous avez mis en place une boucle et
result[i] = { name: "image_name" }
:Pour une raison quelconque, la accepté de répondre à fonctionné pour moi seulement si utilisé une fois sur la page, mais dans mon cas, j'ai essayé d'enregistrer des données sur de nombreux éléments sur la page et les données ont été en quelque sorte perdu sur tout sauf le premier élément.
Comme une alternative, j'ai fini par écrire les données pour les dom et l'analyser en arrière en cas de besoin. C'est peut-être moins efficace, mais bien fonctionné pour mon objectif parce que je suis vraiment prototypage de données et non pas de l'écriture de cette production.
Pour enregistrer les données que j'ai utilisé:
De lire ensuite les données en arrière est le même que l'on a accepté la réponse, à savoir:
Le faisant de cette façon, les données apparaissent dans les dom, si j'étais à inspecter l'élément, le Chrome du débogueur.
.data()
fonctionne parfaitement pour la plupart des cas. La seule fois où j'ai eu un problème a été lorsque la chaîne JSON lui-même avait un seul devis. Je ne pouvais pas trouver un moyen facile d'obtenir passé ce donc eu recours à cette approche (am à l'aide de Coldfusion comme langue du serveur):Pour l'enregistrement, j'ai trouvé le code suivant fonctionne. Il vous permet de récupérer le tableau de la balise de données, appuyez sur un élément nouveau, et de le stocker de retour dans la balise de données dans le bon format JSON. 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);
correctement les magasins de la matrice, mais$('#my-data-div').data('namesarray', names_string);
ne fonctionne pas.});
Ce code fonctionne très bien pour moi.
Coder les données avec btoa
Et puis le décoder avec atob