В последнее время у меня возникла та же проблема, и я выпустил этот плагин .toJSON jQuery, который преобразует форму в объект JSON с такой же структурой. Это также особенно полезно для динамически генерируемых форм, где вы хотите, чтобы ваш пользователь мог добавлять больше полей в определенных местах.
Дело в том, что вы, возможно, захотите построить форму так, чтобы она имела саму структуру, поэтому предположим, что вы хотите создать форму, в которую пользователь вставляет свои любимые места в городе: вы можете представить, что эта форма представляет <places>...</places>
элемент XML, содержащий список мест, которым пользователю нравится список <place>...</place>
элементов, каждый из которых содержит, например, <name>...</name>
элемент, <type>...</type>
элемент, а затем список <activity>...</activity>
элементов, представляющих действия, которые вы можете выполнять в таком месте. Итак, ваша XML-структура будет выглядеть так:
<places>
<place>
<name>Home</name>
<type>dwelling</type>
<activity>sleep</activity>
<activity>eat</activity>
<activity>watch TV</activity>
</place>
<place>...</place>
<place>...</place>
</places>
Как здорово было бы иметь объект JSON из этого, который представлял бы эту точную структуру, так что вы сможете:
- Сохраните этот объект как есть в любой CouchDB- подобной базе данных
- Прочитайте его со стороны вашего сервера $ _POST [] и получите правильно вложенный массив, который вы можете затем семантически манипулировать
- Используйте некоторый серверный скрипт, чтобы преобразовать его в правильно сформированный XML-файл (даже если вы не знаете его точную структуру априори)
- Просто используйте его как в любом серверном скрипте, похожем на Node.js.
Хорошо, теперь нам нужно подумать, как форма может представлять файл XML.
Конечно, это <form>
тег root
, но у нас есть тот <place>
элемент, который является контейнером, а не сам элемент данных, поэтому мы не можем использовать входной тег для него.
Вот где <fieldset>
тег пригодится! Мы будем использовать <fieldset>
теги для представления всех элементов контейнера в нашем представлении формы / XML и, таким образом, получим такой результат:
<form name="places">
<fieldset name="place">
<input type="text" name="name"/>
<select name="type">
<option value="dwelling">Dwelling</option>
<option value="restoration">Restoration</option>
<option value="sport">Sport</option>
<option value="administrative">Administrative</option>
</select>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
</fieldset>
</form>
Как вы можете видеть в этой форме, мы нарушаем правило уникальных имен, но это нормально, потому что они будут преобразованы в массив элементов, поэтому на них будет ссылаться только их индекс внутри массива.
На этом этапе вы можете увидеть, name="array[]"
как внутри формы нет одинакового имени, и все красиво, просто и семантически.
Теперь мы хотим, чтобы эта форма была преобразована в объект JSON, который будет выглядеть следующим образом:
{'places':{
'place':[
{
'name': 'Home',
'type': 'dwelling',
'activity':[
'sleep',
'eat',
'watch TV'
]
},
{...},
{...}
]
}}
Для этого я разработал этот плагин jQuery, который кто-то помог оптимизировать в этой ветке Code Review, и выглядит так:
$.fn.toJSO = function () {
var obj = {},
$kids = $(this).children('[name]');
if (!$kids.length) {
return $(this).val();
}
$kids.each(function () {
var $el = $(this),
name = $el.attr('name');
if ($el.siblings("[name=" + name + "]").length) {
if (!/radio|checkbox/i.test($el.attr('type')) || $el.prop('checked')) {
obj[name] = obj[name] || [];
obj[name].push($el.toJSO());
}
} else {
obj[name] = $el.toJSO();
}
});
return obj;
};
Я также сделал это одно сообщение в блоге, чтобы объяснить это больше.
Это преобразует все в форме в JSON (даже радио и флажки), и все, что вам нужно сделать, это позвонить
$.post('script.php',('form').toJSO(), ...);
Я знаю, что есть много способов конвертировать формы в объекты JSON, .serialize()
и .serializeArray()
в большинстве случаев они отлично работают и в основном предназначены для использования, но я думаю, что вся идея состоит в том, чтобы написать форму в виде структуры XML со значимыми именами и преобразовать ее в Стоит попробовать правильно сформированный объект JSON , а также тот факт, что вы можете добавлять теги ввода с одинаковыми именами, не беспокоясь, что очень полезно, если вам нужно получить динамически сгенерированные данные форм.
Я надеюсь, что это помогает кому-то!