Я храню данные, используя этот 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-
подход?
htmlspecialchars(json_encode($e))
(идея из комментариев Николаса ).jsonObject
нужно ли быть строковым? изменить: на случай, если это поможет кому-то еще, я только что нашел ответ на этот вопрос здесь: stackoverflow.com/a/42864472"You don't need to stringify objects to store them using jQuery.data()"
Собственно, ваш последний пример:
похоже, работает хорошо (см. http://jsfiddle.net/GlauberRocha/Q6kKU/ ).
Приятно то, что строка в атрибуте data- автоматически преобразуется в объект JavaScript. Я не вижу в таком подходе недостатков, наоборот! Одного атрибута достаточно для хранения всего набора данных, готовых к использованию в JavaScript через свойства объекта.
(Примечание: чтобы атрибуты data- автоматически получали тип Object, а не String, вы должны быть осторожны при написании действительного JSON, в частности, чтобы заключить имена ключей в двойные кавычки).
источник
$('div').data('foobar').foo
. api.jquery.com/data'
у меня не работает, пока яecho json_encode($array)
с php. Так как он завершит значение атрибута одинарной кавычкой. Любое предложение, кроме экранирования одинарной кавычки вручную из массива.?&quot;
(HTML-объект с двойным экранированием), чтобы он отображался в исходном коде как & quot ;. Но, может быть, именно этого вы хотите избежать, когда говорите «экранирование одинарной кавычки вручную» ...Вот как это сработало для меня.
объект
Устанавливать
Закодируйте строковый объект с помощью encodeURIComponent () и установите его как атрибут:
Получить
Чтобы получить значение как объект, проанализируйте декодированное значение атрибута с помощью decodeURIComponent () :
источник
Многие проблемы с хранением сериализованных данных можно решить путем преобразования сериализованной строки в base64 .
Строку base64 можно без проблем принять практически где угодно.
Взгляни на:
Конвертировать в / из по мере необходимости.
источник
window.btoa
JSON.parse
прежде чем вы сможете использовать результат в качестве объекта.Для меня это работает так, так как мне нужно сохранить его в шаблоне ...
источник
$('body').data('myData', { h: "hello", w: "world" })
_____________________________________________________________________________________________, вы получите свой объект JSON с помощью$('body').data().myData
'<div data-dataObj=\''+ JSON.stringify(dataObj) +'\'></div>'
. Все это одинарные кавычки, начало и конец просто экранированы, так что это будет то же самое, что и наличие'{"some":"thing"}'
replace()
рассматривает возможность появления одинарных кавычек в данных json, что вполне возможно.Уловкой для меня было добавить двойные кавычки вокруг ключей и значений . Если вы используете функцию PHP,
json_encode
она даст вам строку в кодировке JSON и идею, как правильно кодировать вашу.jQuery('#elm-id').data('datakey')
вернет объект строки, если строка правильно закодирована как json.Согласно документации jQuery: ( http://api.jquery.com/jquery.parsejson/ )
Передача искаженной строки JSON приводит к исключению JavaScript. Например, ниже приведены недопустимые строки JSON:
"{test: 1}"
(test
без двойных кавычек)."{'test': 1}"
('test'
использует одинарные кавычки вместо двойных кавычек)."'test'"
('test'
использует одинарные кавычки вместо двойных кавычек).".1"
(номер должен начинаться с цифры;"0.1"
будет действительным)."undefined"
(undefined
не может быть представлен в строке JSON;null
однако может быть)."NaN"
(NaN
не может быть представлен в строке JSON; прямое представление Infinity также равно nисточник
Совместите использование
window.btoa
иwindow.atob
вместе сJSON.stringify
иJSON.parse
.- Это работает для строк, содержащих одинарные кавычки
Кодирование данных:
Расшифровка данных:
Вот пример того, как данные создаются и декодируются позже с помощью события click.
Создайте HTML и закодируйте данные:
Расшифруйте данные в обработчике события клика:
источник
Использование документированного синтаксиса jquery .data (obj) позволяет сохранить объект в элементе DOM. Проверка элемента не покажет
data-
атрибут, потому что для значения объекта не указан ключ. Однако на данные внутри объекта можно ссылаться с помощью ключа.data("foo")
или весь объект можно вернуть с помощью.data()
.Итак, если вы настроили цикл и
result[i] = { name: "image_name" }
:источник
По какой-то причине принятый ответ работал у меня, только если он использовался один раз на странице, но в моем случае я пытался сохранить данные для многих элементов на странице, и данные каким-то образом были потеряны для всех, кроме первого элемента.
В качестве альтернативы я закончил тем, что записал данные в дом и проанализировал их, когда это было необходимо. Возможно, он менее эффективен, но хорошо сработал для моей цели, потому что я действительно создаю прототипы данных, а не пишу их для производства.
Для сохранения данных я использовал:
Чтобы затем прочитать данные обратно, совпадает с принятым ответом, а именно:
Это также привело к появлению данных в dom, если бы я проверял элемент с помощью отладчика Chrome.
источник
.data()
отлично работает в большинстве случаев. Единственный раз, когда у меня была проблема, это когда в самой строке JSON была одинарная кавычка. Я не мог найти простого способа обойти это, поэтому прибег к такому подходу (я использую Coldfusion в качестве языка сервера):источник
Для записи я обнаружил, что следующий код работает. Это позволяет вам получить массив из тега данных, вставить новый элемент и сохранить его обратно в теге данных в правильном формате JSON. Таким образом, тот же код можно снова использовать для добавления дополнительных элементов в массив, если это необходимо. Я обнаружил, что
$('#my-data-div').attr('data-namesarray', names_string);
правильно хранит массив, но$('#my-data-div').data('namesarray', names_string);
не работает.источник
});
источник
Этот код работает нормально для меня.
Кодировать данные с помощью btoa
А затем расшифровать его с помощью Atob
источник