Estou armazenando dados usando a data-
abordagem em uma tag HTML da seguinte forma:
<td><"button class='delete' data-imagename='"+results[i].name+"'>Delete"</button></td>
Em seguida, estou recuperando os dados em um retorno de chamada como este:
$(this).data('imagename');
Isso funciona bem. O que eu estou preso é tentar salvar o objeto em vez de apenas uma das propriedades dele. Eu tentei fazer isso:
<td><button class='delete' data-image='"+results[i]+"'>Delete</button></td>
Então eu tentei acessar a propriedade name assim:
var imageObj = $(this).data('image');
console.log('Image name: '+imageObj.name);
O log me diz undefined
. Parece que posso armazenar cadeias simples nos data-
atributos, mas não consigo armazenar objetos JSON ...
Eu também tentei usar esse garoto de sintaxe sem sorte:
<div data-foobar='{"foo":"bar"}'></div>
Alguma idéia de como armazenar um objeto real na tag HTML usando a data-
abordagem?
htmlspecialchars(json_encode($e))
(idéia de Nicolas responder aos comentários).jsonObject
precisa ser especificado? edit: no caso de ajuda qualquer outra pessoa, eu só encontrei a resposta para essa pergunta aqui: stackoverflow.com/a/42864472"You don't need to stringify objects to store them using jQuery.data()"
Na verdade, seu último exemplo:
parece estar funcionando bem (consulte http://jsfiddle.net/GlauberRocha/Q6kKU/ ).
O bom é que a string no atributo data é convertida automaticamente em um objeto JavaScript. Não vejo nenhuma desvantagem nessa abordagem, pelo contrário! Um atributo é suficiente para armazenar um conjunto inteiro de dados, pronto para uso em JavaScript por meio das propriedades do objeto.
(Nota: para que os atributos de dados recebam automaticamente o tipo Objeto, em vez de String, você deve ter o cuidado de escrever JSON válido, em particular para colocar os nomes das chaves entre aspas duplas).
fonte
$('div').data('foobar').foo
. api.jquery.com/data'
não está funcionando para mim enquanto euecho json_encode($array)
do php. Como encerrará o valor do atributo por aspas simples. Qualquer sugestão, exceto escapar aspas simples manualmente da matriz.&quot;
(entidade HTML de escape duplo) para que seja renderizado em sua fonte como'. Mas talvez esse é o tipo de coisa que você quer evitar quando você diz "escapar aspas simples manualmente" ...Foi assim que funcionou para mim.
Objeto
Conjunto
Codifique o objeto stringified com encodeURIComponent () e defina como atributo:
Obter
Para obter o valor como um objeto, analise o valor do atributo decodificado, com decodeURIComponent (),:
fonte
Muitos problemas com o armazenamento de dados serializados podem ser resolvidos com a conversão da string serializada em base64 .
Uma string base64 pode ser aceita em qualquer lugar, sem problemas.
Dê uma olhada em:
Converta de / para, conforme necessário.
fonte
window.btoa
JSON.parse
usar o touse antes de poder usar o resultado como um objeto.Para mim, funciona assim, pois preciso armazená-lo no modelo ...
fonte
$('body').data('myData', { h: "hello", w: "world" })
_____________________________________________________________________________________________ você iria receber o seu objeto JSON por$('body').data().myData
'<div data-dataObj=\''+ JSON.stringify(dataObj) +'\'></div>'
. Essas são todas as aspas simples, o início eo fim são apenas escaparam, por isso seria o mesmo que ter'{"some":"thing"}'
replace()
aborda a possibilidade de aspas simples aparecerem nos dados do json, o que é totalmente possível.O truque para mim foi adicionar aspas duplas em torno de chaves e valores . Se você usar uma função PHP
json_encode
, fornecerá uma string codificada em JSON e uma idéia de como codificar corretamente a sua.jQuery('#elm-id').data('datakey')
retornará um objeto da string, se a string estiver codificada corretamente como json.Conforme a documentação do jQuery: ( http://api.jquery.com/jquery.parsejson/ )
A transmissão de uma sequência JSON malformada resulta no lançamento de uma exceção JavaScript. Por exemplo, a seguir, são todas as seqüências JSON inválidas:
"{test: 1}"
(test
não possui aspas duplas)."{'test': 1}"
('test'
está usando aspas simples em vez de aspas duplas)."'test'"
('test'
está usando aspas simples em vez de aspas duplas).".1"
(um número deve começar com um dígito;"0.1"
seria válido)."undefined"
(undefined
não pode ser representado em uma sequência JSON;null
no entanto, pode ser)."NaN"
(NaN
não pode ser representado em uma sequência JSON; a representação direta do Infinity também é nfonte
Combine o uso de
window.btoa
ewindow.atob
junto comJSON.stringify
eJSON.parse
.- Isso funciona para strings contendo aspas simples
Codificando os dados:
Decodificando os dados:
Aqui está um exemplo de como os dados são construídos e decodificados posteriormente com o evento click.
Construa o html e codifique os dados:
Decodifique os dados no manipulador de eventos click:
fonte
O uso da sintaxe documentada de jquery .data (obj) permite armazenar um objeto no elemento DOM. A inspeção do elemento não mostrará o
data-
atributo porque não há chave especificada para o valor do objeto. No entanto, os dados dentro do objeto podem ser referenciados por chave com.data("foo")
ou o objeto inteiro pode ser retornado com.data()
.Supondo que você configure um loop e
result[i] = { name: "image_name" }
:fonte
Por alguma razão, a resposta aceita funcionou para mim apenas se fosse usada uma vez na página, mas no meu caso eu estava tentando salvar dados em muitos elementos da página e os dados foram perdidos de alguma forma em todos, exceto no primeiro elemento.
Como alternativa, acabei escrevendo os dados no Dom e analisando-os quando necessário. Talvez seja menos eficiente, mas funcionou bem para o meu propósito, porque estou realmente fazendo a prototipagem de dados e não escrevendo isso para produção.
Para salvar os dados que eu usei:
Ler os dados novamente é o mesmo que a resposta aceita, a saber:
Fazer isso dessa maneira também fazia os dados aparecerem no domínio se eu fosse inspecionar o elemento com o depurador do Chrome.
fonte
.data()
funciona perfeitamente para a maioria dos casos. A única vez que tive um problema foi quando a própria string JSON tinha uma única citação. Não consegui encontrar uma maneira fácil de superar isso, recorrendo a essa abordagem (estou usando o Coldfusion como linguagem de servidor):fonte
Para o registro, eu encontrei o seguinte código funciona. Ele permite recuperar a matriz da tag de dados, ativar um novo elemento e armazená-lo novamente na tag de dados no formato JSON correto. Portanto, o mesmo código pode ser usado novamente para adicionar outros elementos à matriz, se desejado. Descobri que
$('#my-data-div').attr('data-namesarray', names_string);
armazena corretamente a matriz, mas$('#my-data-div').data('namesarray', names_string);
não funciona.fonte
});
fonte
Este código está funcionando bem para mim.
Codifique dados com btoa
E então decodifique com atob
fonte