Сохранить возвращаемое значение 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';

или я что то пропускаю?

Другие вопросы по тегам