Как я могу установить мои данные как JSON в скрытом поле ввода
У меня есть поле ввода, подобное приведенному ниже
<input type="hidden" value="" id="inputField">
Теперь у меня есть список продуктов, и для каждого продукта у меня есть флажок. Когда пользователь нажимает на этот флажок, я получаю идентификатор и имя продукта. Теперь я хочу сохранить его снова в скрытом поле, как показано ниже
<input type="hidden"
value="[{"product_id":123,"name":"stack"},{"product_id":456,"name":"overflow"}]"
id="inputField"
>
Мой первый вопрос: как я могу это сделать и как я могу создать JSON?
Во-вторых, если пользователь снова отключает флажок продукта, мне нужно получить текущее скрытое значение и преобразовать его в некоторую структуру данных, удалить неконтролируемый идентификатор поля из структуры данных и затем сохранить его снова в скрытом поле.
Есть ли библиотека, которая выполняет это задание в JavaScript?
Ответы
Ответ 1
Использование jQuery:
HTML:
<input type="hidden" value='[{"product_id":123,"name":"stack"},{"product_id":456,"name":"overflow"}]'
id="inputField">
JS:
var data = {}
data.products = jQuery.parseJSON($('#inputField').val())
alert(data.products[0].product_id)
Ответ 2
Строковый блок, который вы ищете, JSON.stringify
и JSON.parse
;
var stringData = '[{"product_id":123,"name":"stack"}, {"product_id":456,"name":"overflow"}]';
// Convert a string to an JavaScript object
var arrayData = JSON.parse(stringData);
// Convert a JavaScript object to a string
stringData = JSON.stringify(arrayData);
Теперь, когда один из ваших флажков изменит состояние, вы получите объект из скрытого поля и измените его. После изменения объекта вы сохраните строку обратно в скрытое поле.
Чтобы прочитать и сохранить значение из/в скрытое поле:
var field = document.getElementById('inputField');
// Reading the value
stringData = field.getAttribute('value');
// Storing the value
field.setAttribute('value', stringData);
Вам по-прежнему не хватает модификаций вашего массива, который вы бы сделали схожим с:
// Adding a newly checked product
arrayData.push({
product_id: …,
name: …
});
// Removing a product from the list is more complicated
arrayData = arrayData.filter(function(product){
var productIdToRemove = …;
return product.product_id!==productIdToRemove;
});
В отношении библиотек: Вероятно, большинство из них содержат код для облегчения манипулирования массивами и настройки данных формы. См. Документацию по jQuery или прототипу или другие ответы для примеров.
Просто мысль: не было бы проще отбросить всю идею использования скрытого поля и вместо этого перенести флажки на сервер. Если флажок установлен, используйте его, в противном случае игнорируйте сопоставимые данные продукта.
Ответ 3
В JavaScript просто присвойте значение:
var json = JSON.stringify([{"product_id":123,"name":"stack"}]);
document.getElementById('inputField').setAttribute('value', json);
На серверном языке кодируйте JSON в HTML, например, с помощью php htmlspecialchars
или python html.escape
. Результат будет выглядеть следующим образом:
<input type="hidden" id="inputField"
value="[{"product_id":123,"name":"stack"}]">
Ответ 4
Как указано в других ответах ниже, чтобы преобразовать JSON в строку, используйте функцию JSON.stringify() следующим образом:
var json = JSON.stringify([{"product_id":123,"name":"stack"}]);
document.getElementById('inputField').setAttribute('value', json);
И вы получите строковое представление объекта JSON в var json
. Чтобы сделать это другим способом, чтобы вы могли обновить фактический объект JSON, содержащийся в этой строке, вы можете использовать eval:
var json_object = eval("("+json+")");
Теперь исходный объект JSON воссоздается, и вы можете его обновить, а затем повторно удалить его обратно в скрытое поле или какой-либо другой var...
Ответ 5
Я все еще немного запутался в вашем вопросе, но если вы просто сохраняете имя и идентификатор из флажков ввода, которые были отмечены, вы можете сделать это достаточно просто с помощью jQuery.
var jsonArray = [];
$("input:checkbox:checked").each(function(){
var jsonObj = {};
jsonObj.product_id = $(this).attr("id");
jsonObj.name = $(this).attr("name");
jsonArray.push(jsonObj);
});
Переменная jsonArray
теперь будет содержать строку json, подобную приведенному выше примеру. Вы можете использовать JSON.stringify(jsonArray)
, чтобы увидеть это.
Нет необходимости создавать скрытое поле, удерживая эту строку в качестве значения и пытаясь добавить и удалить ее при изменении состояния флажка. Просто выполните javascript, когда страница готова к изменению с помощью нажатия кнопки и т.д.
Желаем удачи.
Ответ 6
Если у вас есть объект JSON, сохраните его в скрытом поле, используя JSON.stringify
:
var myObj = [{"product_id":123,"name":"stack"},{"product_id":456,"name":"overflow"}];
document.getElementById('inputField').value = JSON.stringify(myObj);
Ответ 7
Я бы предложил использовать функцию encodeURIComponent
. Вместе с JSON.stringify
мы должны иметь что-то вроде следующего:
var data= "{"name":"John"}";
var encodeddata encodeURIComponent(JSON.stringify(var data= "{"name":"John"}";
))
Теперь это значение можно безопасно сохранить в скрытом виде ввода, например:
<input type="hidden" value="'+encodeddata+'">
Теперь, чтобы прочитать данные назад, мы можем сделать что-то вроде:
var data = JSON.parse(decodeURIComponent(value))
Ответ 8
Добавить библиотеку
"<% @taglib uri =" http://java.sun.com/jsp/jstl/functions "prefix =" fn "% > "
Использование: ${fn: escapeXml (string1)}
input type = "hidden" value = "$ {fn: escapeXml (string1)}" id = "inputField"