Хранить объект JSON в атрибуте данных в HTML jQuery
Я храню данные с помощью подхода data-
в теге HTML, например:
<td><"button class='delete' data-imagename='"+results[i].name+"'>Delete"</button></td>
Затем я получаю данные в обратном вызове следующим образом:
$(this).data('imagename');
Это прекрасно работает. То, что я застрял, пытается сохранить объект вместо одного из его свойств. Я попытался сделать это:
<td><button class='delete' data-image='"+results[i]+"'>Delete</button></td>
Затем я попытался получить доступ к свойству name следующим образом:
var imageObj = $(this).data('image');
console.log('Image name: '+imageObj.name);
Журнал сообщает мне undefined
. Поэтому кажется, что я могу хранить простые строки в атрибутах data-
, но я не могу хранить объекты JSON...
Я также пытался использовать этот синтаксис без везения:
<div data-foobar='{"foo":"bar"}'></div>
Любая идея о том, как сохранить фактический объект в теге HTML с помощью подхода data-
?
Ответы
Ответ 1
вместо того, чтобы вставлять его в текст, просто используйте $('#myElement').data('key',jsonObject);
на самом деле он не будет храниться в html, но если вы используете jquery.data, все это абстрагируется в любом случае.
Чтобы вернуть JSON назад не анализировать его, просто позвоните:
var getBackMyJSON = $('#myElement').data('key');
Если вы получаете [Object Object]
вместо прямого JSON, просто войдите в свой JSON с помощью ключа данных:
var getBackMyJSON = $('#myElement').data('key').key;
Ответ 2
Собственно, ваш последний пример:
<div data-foobar='{"foo":"bar"}'></div>
кажется, работает хорошо (см. http://jsfiddle.net/GlauberRocha/Q6kKU/).
Хорошо, что строка в атрибуте data автоматически преобразуется в объект JavaScript. Напротив, я не вижу недостатка в этом подходе! Одного атрибута достаточно для хранения целого набора данных, готовых для использования в JavaScript через свойства объекта.
(Примечание: для атрибутов данных, которые будут автоматически заданы тип Object, а не String, вы должны быть осторожны, чтобы писать допустимый JSON, в частности, чтобы заключить имена ключей в двойные кавычки).
Ответ 3
Для меня это работает так, как мне нужно сохранить его в шаблоне...
// Generate HTML
var gridHtml = '<div data-dataObj=\''+JSON.stringify(dataObj).replace(/'/g, "\\'");+'\'></div>';
// Later
var dataObj = $('div').data('dataObj'); // jQuery automatically unescape it
Ответ 4
Многие проблемы с хранением сериализованных данных могут быть решены путем преобразования сериализованной строки в base64. Строка base64 может быть принята практически везде без суеты. Взгляните на:
atob()
btoa()
Преобразовать в/из при необходимости.
Ответ 5
Вот как это сработало для меня.
Чтобы сохранить JSON в атрибуте данных HTML, объект Stringy JSON и закодировать его с помощью метода encodeURIComponent().
При чтении данных верните его с помощью метода decodeURIComponent() и проанализируйте строку для объекта JSON.
Пример:
var my_object ={"Super Hero":["Iron Man", "Super Man"]};
Сохранение данных:
var data_str = encodeURIComponent(JSON.stringify(my_object));
$("div#mydiv").attr("data-hero",data-str);
Чтение данных:
var data_str = $("div#mydiv").attr("data-hero");
var my_object = JSON.parse(decodeURIComponent(data_str));
Ответ 6
Используя документированный синтаксис jQuery.data(obj), вы можете сохранить объект в элементе DOM. При проверке элемента не будет отображаться атрибут data-
, поскольку для значения объекта нет ключа. Тем не менее, данные в объекте могут ссылаться на ключ с помощью .data("foo")
или весь объект может быть возвращен с помощью .data()
.
Итак, предположим, что вы настроили цикл и result[i] = { name: "image_name" }
:
$('.delete')[i].data(results[i]); // => <button class="delete">Delete</delete>
$('.delete')[i].data('name'); // => "image_name"
$('.delete')[i].data(); // => { name: "image_name" }
Ответ 7
По какой-то причине принятый ответ работал на меня, только если он использовался один раз на странице, но в моем случае я пытался сохранить данные по многим элементам на странице, и данные были как-то потеряны на всех, кроме первого элемента.
В качестве альтернативы я закончил тем, что записывал данные в dom и разбирал их в случае необходимости. Возможно, это менее эффективно, но хорошо работает для моей цели, потому что я действительно прототипирую данные и не пишу это для производства.
Чтобы сохранить данные, которые я использовал:
$('#myElement').attr('data-key', JSON.stringify(jsonObject));
Для того, чтобы прочитать данные назад, это то же самое, что и принятый ответ, а именно:
var getBackMyJSON = $('#myElement').data('key');
Выполнение этого способа также заставило данные отображаться в dom, если я должен был проверить элемент с помощью отладчика Chrome.
Ответ 8
.data()
отлично работает в большинстве случаев. Единственный раз, когда у меня была проблема, было то, что в строке JSON была одиночная цитата. Я не мог найти какой-либо простой способ преодолеть это, поэтому прибегал к этому подходу (я использую Coldfusion в качестве языка сервера):
<!DOCTYPE html>
<html>
<head>
<title>
Special Chars in Data Attribute
</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<script src="https://code.jquery.com/jquery-1.12.2.min.js"></script>
<script>
$(function(){
var o = $("##xxx");
/**
1. get the data attribute as a string using attr()
2. unescape
3. convert unescaped string back to object
4. set the original data attribute to future calls get it as JSON.
*/
o.data("xxx",jQuery.parseJSON(unescape(o.attr("data-xxx"))));
console.log(o.data("xxx")); // this is JSON object.
});
</script>
<title>
Title of the document
</title>
</head>
<body>
<cfset str = {name:"o'reilly stuff",code:1}>
<!-- urlencode is a CF function to UTF8 the string, serializeJSON converts object to strin -->
<div id="xxx" data-xxx='#urlencodedformat(serializejson(str))#'>
</div>
</body>
</html>
Ответ 9
Для записи я обнаружил, что работает следующий код. Он позволяет извлекать массив из тега данных, вставлять новый элемент и хранить его обратно в теге данных в правильном формате JSON. Таким образом, один и тот же код можно использовать снова, чтобы добавить дополнительные элементы в массив, если это необходимо. Я обнаружил, что $('#my-data-div').attr('data-namesarray', names_string);
правильно хранит массив, но $('#my-data-div').data('namesarray', names_string);
не работает.
<div id="my-data-div" data-namesarray='[]'></div>
var names_array = $('#my-data-div').data('namesarray');
names_array.push("Baz Smith");
var names_string = JSON.stringify(names_array);
$('#my-data-div').attr('data-namesarray', names_string);
Ответ 10
Хитрость для меня заключалась в добавлении двойных кавычек вокруг ключей и значений. Если вы используете функцию php, например json_encode, вы получите кодировку json и идею, как правильно закодировать ваш.
jQuery ('# elm-id'). data ('datakey') вернет объект строки, если строка правильно закодирована как json.
Согласно документации jQuery: (http://api.jquery.com/jquery.parsejson/)
Передача в неправильной строке JSON приводит к генерированию исключения JavaScript. Например, следующие недопустимые строки JSON:
- "{test: 1}" (у него нет двойных кавычек).
- "{'test': 1}" ('test' использует одинарные кавычки вместо двойных кавычек).
- "'test'" ('test' использует одинарные кавычки вместо двойных кавычек).
- ". 1" (число должно начинаться с цифры, "0,1" будет действительным).
- "undefined" (undefined не может быть представлен в строке JSON, но null может быть).
- "NaN" (NaN не может быть представлен в строке JSON, прямое представление Infinity также равно n