我最近遇到了同样的问题,并提出了this .toJSON jQuery plugin,它将表单转换为具有相同结构的 JSON 对象。这对于您希望让用户在特定位置添加更多字段的动态生成表单也特别有用。
关键是您可能实际上想要构建一个表单,以便它本身具有结构,所以假设您想要创建一个表单,用户可以在其中插入他最喜欢的城镇地点:您可以想象这个表单代表一个@ 987654327@ 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-like 数据库中
- 从您的 $_POST[] 服务器端读取它并检索一个正确嵌套的数组,然后您可以对其进行语义操作
- 使用一些服务器端脚本将其转换为格式良好的 XML 文件(即使您不知道它的确切结构先验)
- 以某种方式在任何Node.js-like 服务器脚本中使用它
好的,现在我们需要考虑一个表单如何表示一个 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'
]
},
{...},
{...}
]
}}
为此,我开发了this jQuery plugin here,有人帮助优化了this Code Review thread,看起来像这样:
$.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;
};
我还发了this one blog post 来解释更多。
这会将表单中的所有内容都转换为 JSON(甚至是单选框和复选框),您剩下要做的就是调用
$.post('script.php',('form').toJSO(), ...);
我知道有很多方法可以将表单转换为 JSON 对象,并且确保 .serialize() 和 .serializeArray() 在大多数情况下工作得很好,并且主要用于使用,但我认为编写表单的整个想法作为具有有意义名称的 XML 结构并将其转换为格式良好的 JSON 对象 值得一试,此外,如果您需要检索动态生成的表单,您可以添加同名输入标签而无需担心这一事实非常有用数据。
我希望这对某人有帮助!