Сохранить возвращаемое значение json во входном скрытом поле
Мне было интересно, возможно ли сохранить возвращаемый JSON в скрытом поле ввода. Например, вот что возвращает мой json:
[{"id":"15aea3fa","firstname":"John","lastname":"Doe"}]
Я хотел бы просто сохранить идентификатор в скрытом поле, чтобы я мог сослаться на него позже, чтобы что-то с ним сделать.
Пример: у меня есть что-то вроде этого:
<input id="HiddenForId" type="hidden" value="" />
и хотел бы, чтобы jquery вернул мне значение позже так:
var scheduletimeid = $('#HiddenForId').val();
7 ответов
Вы можете сохранить его в скрытом поле, ИЛИ сохранить его в объекте javascript (мое предпочтение), поскольку вероятный доступ будет осуществляться через javascript.
ПРИМЕЧАНИЕ: поскольку у вас есть массив, к нему можно получить доступ как myvariable[0]
для первого элемента (как у вас есть).
РЕДАКТИРОВАТЬ пример показа:
clip...
success: function(msg)
{
LoadProviders(msg);
},
...
var myvariable ="";
function LoadProviders(jdata)
{
myvariable = jdata;
};
alert(myvariable[0].id);// shows "15aea3fa" in the alert
РЕДАКТИРОВАТЬ: Создал эту страницу: http://jsfiddle.net/GNyQn/ чтобы продемонстрировать выше. В этом примере делается предположение, что вы уже правильно вернули свои именованные строковые значения в массиве, и вам просто нужно сохранить их для каждого OP-вопроса. В этом примере я также поместил значения первого возвращенного массива (для каждого примера OP) в div в виде текста.
Я не уверен, почему это считается "сложным", так как я не вижу более простого способа обработки этих строк в этом массиве.
Хотя я видел предложенные методы, которые использовались и работают, я думаю, что установка значения скрытого поля только с использованием JSON.stringify нарушает HTML...
Здесь я объясню, что я имею в виду:
<input type="hidden" value="{"name":"John"}">
Как вы можете видеть, первая двойная кавычка после скобки с открытой цепью может интерпретироваться некоторыми браузерами как:
<input type="hidden" value="{" rubbish >
Поэтому для лучшего подхода к этому я бы предложил использовать функцию encodeURIComponent. Вместе с JSON.stringify у нас должно быть что-то вроде следующего:
> encodeURIComponent(JSON.stringify({"name":"John"}))
> "%7B%22name%22%3A%22John%22%7D"
Теперь это значение можно безопасно сохранить во входном скрытом типе, например:
<input type="hidden" value="%7B%22name%22%3A%22John%22%7D">
или (что еще лучше) с помощью атрибута data элемента HTML, управляемого скриптом, который будет использовать данные, например, так:
<div id="something" data-json="%7B%22name%22%3A%22John%22%7D"></div>
Теперь, чтобы прочитать данные обратно, мы можем сделать что-то вроде:
> var data = JSON.parse(decodeURIComponent(div.getAttribute("data-json")))
> console.log(data)
> Object {name: "John"}
Ты можешь использовать input.value = JSON.stringify(obj)
преобразовать объект в строку.
И когда вам это нужно обратно, вы можете использовать obj = JSON.parse(input.value)
Объект JSON доступен в современных браузерах или вы можете использовать библиотеку json2.js с сайта json.org
Если вы используете JSON Serializer, вы можете просто сохранить свой объект в строковом формате как таковой
myHiddenText.value = JSON.stringify( myObject );
Затем вы можете вернуть значение с
myObject = JSON.parse( myHiddenText.value );
Однако, если вы не собираетесь передавать это значение через отправку страниц, это может быть проще для вас, и вы сэкономите много сериализации, если просто уберете его как глобальную переменную javascript.
решение base64
// encode
theInput.value = btoa(JSON.stringify({ test: true }));
// decode
let decoded = JSON.parse(atob(theInput.value));
Почему base64?
Поле ввода может обрабатываться серверной частью, которая работает на языке программирования, отличном от JavaScript. Например, в PHP
rawurlencode
реализация немного отличается от JavaScript
encodeURIComponent
. Кодируя его в base64, вы уверены, что любой другой язык программирования, работающий на бэкэнде, обработает его так, как ожидалось.
Похоже, возвращаемое значение находится в массиве? Это несколько странно... и также имейте в виду, что некоторые браузеры позволяют это анализировать из междоменного запроса (что не так, когда у вас есть объект JSON верхнего уровня).
В любом случае, если это оболочка массива, вам нужно что-то вроде этого:
$('#my-hidden-field').val(theObject[0].id);
Позже вы можете получить его с помощью простого вызова.val() в том же поле. Это, честно говоря, выглядит довольно странно. Скрытое поле не будет сохраняться при запросах страниц, так почему бы просто не сохранить его в своем собственном (псевдо-именном) интервале значений? Например,
$MyNamespace = $MyNamespace || {};
$MyNamespace.myKey = theObject;
Это сделает его доступным из любой точки мира без какого-либо хакерского управления полями ввода. Это также намного эффективнее, чем модификация DOM для простого хранения значений.
Просто установите скрытое поле с помощью JavaScript:
document.getElementById('elementId').value = 'whatever';
или я что то пропускаю?