сохранить возвращаемое значение json в скрытом поле ввода - PullRequest
44 голосов
/ 10 августа 2010

Мне было интересно, возможно ли сохранить возвращаемый JSON в скрытом поле ввода. Например, вот что возвращает мой json:

[{"id":"15aea3fa","firstname":"John","lastname":"Doe"}]

Я хотел бы просто сохранить идентификатор в скрытом поле, чтобы я мог ссылаться на него позже, чтобы что-то с ним сделать.

Пример: у меня есть что-то вроде этого:

<input id="HiddenForId" type="hidden" value="" />

и хотел бы, чтобы jquery возвращал мне значение позже так:

var scheduletimeid = $('#HiddenForId').val();

Ответы [ 6 ]

129 голосов
/ 26 августа 2013

Хотя я видел предложенные методы, которые использовались и работают, я думаю, что установка значения скрытого поля только с помощью 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"}
20 голосов
/ 10 августа 2010

Вы можете использовать input.value = JSON.stringify(obj) для преобразования объекта в строку.
А когда вам это понадобится, вы можете использовать obj = JSON.parse(input.value)

Объект JSON доступен в современных браузерах или вы можете использовать библиотеку json2.js из json.org

19 голосов
/ 10 августа 2010

Вы можете сохранить его в скрытом поле, ИЛИ сохранить его в объекте 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 в виде текста.

Я не уверен, почему это рассматривается как "сложный", поскольку я не вижу более простого способа обработки этих строк в этом массиве.

12 голосов
/ 10 августа 2010

Если вы используете JSON Serializer , вы можете просто сохранить свой объект в строковом формате как таковой

myHiddenText.value = JSON.stringify( myObject );

Затем вы можете вернуть значение с помощью

myObject = JSON.parse( myHiddenText.value );

Однако, если вы не собираетесь передавать это значение между отправками страниц, это может быть проще для вас, и вы сэкономите много сериализации, если просто уберете его как глобальную переменную javascript.

0 голосов
/ 10 августа 2010

Похоже, возвращаемое значение находится в массиве? Это несколько странно ... и имейте в виду, что некоторые браузеры разрешают это анализировать из междоменного запроса (что неверно, если у вас есть объект JSON верхнего уровня).

В любом случае, если это оболочка массива, вам нужно что-то вроде этого:

$('#my-hidden-field').val(theObject[0].id);

Позже вы можете получить его с помощью простого вызова .val () в том же поле. Это, честно говоря, выглядит немного странно. Скрытое поле не будет сохраняться при запросах страниц, так почему бы вам просто не сохранить его в своем собственном (псевдо-именном пространстве) сегменте значений? Например.,

$MyNamespace = $MyNamespace || {};
$MyNamespace.myKey = theObject;

Это сделает его доступным для вас из любого места, без какого-либо хакерского управления полями ввода. Это также намного эффективнее, чем модификация DOM для простого хранения значений.

0 голосов
/ 10 августа 2010

просто установите скрытое поле с помощью JavaScript:

document.getElementById('elementId').value = 'whatever';

или я что-то пропустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...