Estoy almacenando datos usando el data-
enfoque en una etiqueta HTML de esta manera:
<td><"button class='delete' data-imagename='"+results[i].name+"'>Delete"</button></td>
Luego estoy recuperando los datos en una devolución de llamada como esta:
$(this).data('imagename');
Eso funciona bien Lo que estoy atascado es tratar de guardar el objeto en lugar de solo una de sus propiedades. Traté de hacer esto:
<td><button class='delete' data-image='"+results[i]+"'>Delete</button></td>
Luego intenté acceder a la propiedad de nombre de esta manera:
var imageObj = $(this).data('image');
console.log('Image name: '+imageObj.name);
El registro me lo dice undefined
. Entonces parece que puedo almacenar cadenas simples en los data-
atributos pero no puedo almacenar objetos JSON ...
También intenté usar este tipo de sintaxis sin suerte:
<div data-foobar='{"foo":"bar"}'></div>
¿Alguna idea sobre cómo almacenar un objeto real en la etiqueta HTML utilizando el data-
enfoque?
htmlspecialchars(json_encode($e))
(idea de los comentarios de respuesta de Nicolas ).jsonObject
necesita ser stringified? editar: en caso de que ayude a alguien más, acabo de encontrar la respuesta a esa pregunta aquí: stackoverflow.com/a/42864472"You don't need to stringify objects to store them using jQuery.data()"
En realidad, tu último ejemplo:
parece estar funcionando bien (ver http://jsfiddle.net/GlauberRocha/Q6kKU/ ).
Lo bueno es que la cadena en el atributo de datos se convierte automáticamente en un objeto JavaScript. ¡No veo ningún inconveniente en este enfoque, al contrario! Un atributo es suficiente para almacenar un conjunto completo de datos, listo para usar en JavaScript a través de las propiedades del objeto.
(Nota: para que los atributos de datos reciban automáticamente el tipo Objeto en lugar de Cadena, debe tener cuidado de escribir un JSON válido, en particular para encerrar los nombres clave entre comillas dobles).
fuente
$('div').data('foobar').foo
. api.jquery.com/data'
no funciona para mí mientras estoyecho json_encode($array)
en php. Dado que terminará el valor del atributo con comillas simples. ¿Alguna sugerencia, excepto escapar de comillas simples manualmente de la matriz?&quot;
(entidad HTML de doble escape) para que se represente en su fuente como & quot ;. Pero tal vez ese es el tipo de cosas que quieres evitar cuando dices "escapar de una cita simple manualmente" ...Así es como funcionó para mí.
Objeto
Conjunto
Codifique el objeto en cadena con encodeURIComponent () y establezca como atributo:
Obtener
Para obtener el valor como un objeto, analice el valor de atributo decodificado, con decodeURIComponent () :
fuente
Se pueden resolver muchos problemas con el almacenamiento de datos serializados convirtiendo la cadena serializada a base64 .
Se puede aceptar una cadena base64 en casi cualquier lugar sin problemas.
Echa un vistazo a:
Convierte a / desde según sea necesario.
fuente
window.btoa
JSON.parse
usar antes de poder usar el resultado como un objeto.Para mí funciona así, ya que necesito almacenarlo en una plantilla ...
fuente
$('body').data('myData', { h: "hello", w: "world" })
_____________________________________________________________________________________________ obtendrá su objeto JSON en$('body').data().myData
'<div data-dataObj=\''+ JSON.stringify(dataObj) +'\'></div>'
. Esas son todas comillas simples, el principio y el final simplemente se escapan, por lo que sería lo mismo que tener'{"some":"thing"}'
replace()
aborda la posibilidad de que aparezcan comillas simples en los datos json, lo cual es completamente posible.El truco para mí fue agregar comillas dobles alrededor de las claves y los valores . Si usa una función PHP como
json_encode
le dará una cadena codificada JSON y una idea de cómo codificar correctamente la suya.jQuery('#elm-id').data('datakey')
devolverá un objeto de la cadena, si la cadena está codificada correctamente como json.Según la documentación de jQuery: ( http://api.jquery.com/jquery.parsejson/ )
Al pasar una cadena JSON con formato incorrecto, se genera una excepción de JavaScript. Por ejemplo, las siguientes son todas las cadenas JSON no válidas:
"{test: 1}"
(test
no tiene comillas dobles a su alrededor)."{'test': 1}"
('test'
utiliza comillas simples en lugar de comillas dobles)."'test'"
('test'
utiliza comillas simples en lugar de comillas dobles).".1"
(un número debe comenzar con un dígito;"0.1"
sería válido)."undefined"
(undefined
no se puede representar en una cadena JSON;null
sin embargo, se puede representar)."NaN"
(NaN
no se puede representar en una cadena JSON; la representación directa de Infinity también es nfuente
Combina el uso de
window.btoa
ywindow.atob
junto conJSON.stringify
yJSON.parse
.- Esto funciona para cadenas que contienen comillas simples
Codificación de los datos:
Decodificando los datos:
Aquí hay un ejemplo de cómo se construyen y decodifican los datos más tarde con el evento click.
Construya el html y codifique los datos:
Decodifique los datos en el controlador de eventos click:
fuente
El uso de la sintaxis documentada jquery .data (obj) le permite almacenar un objeto en el elemento DOM. La inspección del elemento no mostrará el
data-
atributo porque no hay una clave especificada para el valor del objeto. Sin embargo, los datos dentro del objeto pueden ser referenciados por clave con.data("foo")
o todo el objeto puede ser devuelto con.data()
.Asumiendo que configura un bucle y
result[i] = { name: "image_name" }
:fuente
Por alguna razón, la respuesta aceptada funcionó para mí solo si se usaba una vez en la página, pero en mi caso estaba tratando de guardar datos en muchos elementos de la página y los datos se perdieron de alguna manera en todos, excepto en el primer elemento.
Como alternativa, terminé escribiendo los datos en el dom y analizándolos nuevamente cuando era necesario. Quizás sea menos eficiente, pero funcionó bien para mi propósito porque realmente estoy creando prototipos de datos y no escribiendo esto para la producción.
Para guardar los datos que utilicé:
Luego, leer los datos nuevamente es lo mismo que la respuesta aceptada, a saber:
Hacerlo de esta manera también hizo que los datos aparecieran en el dom si tuviera que inspeccionar el elemento con el depurador de Chrome.
fuente
.data()
Funciona perfectamente para la mayoría de los casos. La única vez que tuve un problema fue cuando la cadena JSON tenía una comilla simple. No pude encontrar ninguna manera fácil de superar esto, así que recurrí a este enfoque (estoy usando Coldfusion como lenguaje de servidor):fuente
Para el registro, encontré que el siguiente código funciona. Le permite recuperar la matriz de la etiqueta de datos, activar un nuevo elemento y almacenarlo nuevamente en la etiqueta de datos en el formato JSON correcto. Por lo tanto, se puede usar el mismo código nuevamente para agregar más elementos a la matriz si se desea. Descubrí que
$('#my-data-div').attr('data-namesarray', names_string);
almacena correctamente la matriz, pero$('#my-data-div').data('namesarray', names_string);
no funciona.fuente
});
fuente
Este código está funcionando bien para mí.
Codificar datos con btoa
Y luego descifrarlo con atob
fuente