kgiannakakis 的遍历地图的建议是一个很好的起点,尽管我不认为它可以作为我最初问题的答案。经过几个小时的头撞后,我解决了这个问题,它允许您基于自定义属性序列化元素(我不想满足于必须在我的表单元素上使用 'name' 属性,这是 jQuery 要求的)。我还开始使用来自 json.org 的 JSON 库来对我创建的对象进行字符串化。我的插件的serializeToJSON函数是我一直在寻找的问题的答案,其余的只是 exta。
注意:这是针对客户端的,因此“CustomXXX”名称和属性已替换为实际内容
jQuery.fn.extend({
serializeCustomPropertyArray: function() {
return this.map(function() {
return this.elements ? jQuery.makeArray(this.elements) : this;
}).filter(function() {
return jQuery(this).attr('CustomAttribute') &&
(this.checked || /select|textarea/i.test(this.nodeName) ||
/text|hidden|password|search/i.test(this.type));
}).map(function(i, elem) {
var val = jQuery(this).val();
return val == null ? null : jQuery.isArray(val) ?
jQuery.map(val, function(val, i) {
return { name: jQuery(elem).attr('CustomAttribute'), value: val };
}) : { name: jQuery(elem).attr('CustomAttribute'), value: val };
}).get();
},
serializeToJSON: function() {
var objectMap = this.serializeCustomPropertyArray();
var objectJson = new Object;
jQuery.each(objectMap, function() {
objectJson[this.name] = (this.value !== null) ? this.value : 'null';
});
return JSON.stringify(objectJson);
}
});
这可以称为:
$('#fields').find(':input[CustomGroup="Months"]').serializeToJSON();
假设您的文档看起来像:
<div id="fields">
<input type="checkbox" CustomGroup="Months" CustomAttribute="January" />January<br />
<input type="checkbox" CustomGroup="Months" CustomAttribute="February" />February<br />
...
</div>
构建的 JSON 如下所示:
{ January: 'on', February: 'on', ... }