我正在使用jQuery Serialize来序列化我的表单元素,并希望将它们反序列化。不幸的是找不到任何有效的jQuery反序列化器,有什么建议吗?
答案 0 :(得分:59)
我编写了一个jQuery.deserialize版本,它支持从serialize,serializeArray和serializeObject函数生成的序列化数据。它还支持所有表单元素类型,包括复选框和单选按钮。
答案 1 :(得分:23)
试试这个:
function deparam(query) {
var pairs, i, keyValuePair, key, value, map = {};
// remove leading question mark if its there
if (query.slice(0, 1) === '?') {
query = query.slice(1);
}
if (query !== '') {
pairs = query.split('&');
for (i = 0; i < pairs.length; i += 1) {
keyValuePair = pairs[i].split('=');
key = decodeURIComponent(keyValuePair[0]);
value = (keyValuePair.length > 1) ? decodeURIComponent(keyValuePair[1]) : undefined;
map[key] = value;
}
}
return map;
}
答案 2 :(得分:18)
我对尝试JQuery.deserialize非常感兴趣,但它似乎根本没有处理复选框,所以它不符合我的目的。所以我写了自己的。事实证明这比我想象的要容易,因为jQuery val()函数完成了大部分工作:
jQuery.fn.deserialize = function (data) {
var f = this,
map = {},
find = function (selector) { return f.is("form") ? f.find(selector) : f.filter(selector); };
//Get map of values
jQuery.each(data.split("&"), function () {
var nv = this.split("="),
n = decodeURIComponent(nv[0]),
v = nv.length > 1 ? decodeURIComponent(nv[1]) : null;
if (!(n in map)) {
map[n] = [];
}
map[n].push(v);
})
//Set values for all form elements in the data
jQuery.each(map, function (n, v) {
find("[name='" + n + "']").val(v);
})
//Clear all form elements not in form data
find("input:text,select,textarea").each(function () {
if (!(jQuery(this).attr("name") in map)) {
jQuery(this).val("");
}
})
find("input:checkbox:checked,input:radio:checked").each(function () {
if (!(jQuery(this).attr("name") in map)) {
this.checked = false;
}
})
return this;
};
您应该可以像这样使用:
$("#myform").deserialize(data);
数据是一个参数列表,例如$(“#myform”)。serialize()会生成。
它会影响表单中的所有字段,它将清除数据中未包含的字段的值。但您也可以传递任何选择器以仅影响特定字段,就像使用序列化函数一样。 E.g:
$("select").deserialize(data);
答案 3 :(得分:9)
jQuery Serialize的一半是param(),因此反序列化查询字符串的一半将成为一个deparam。不幸的是,我找不到一个好的独立deparam。现在我建议使用jQuery BBQ library并使用它。如果你不需要其他东西,你可以删除它们。我在某地读过Ben Alman(牛仔)计划将deparam提取到自己的模块中。
对于反序列化的其余部分,您只需要遍历deparam返回的对象以及对象中的每个键和值对,根据键选择表单元素,并将表单元素值设置为值。
答案 4 :(得分:5)
这一点迟到了,但是有人可能觉得这很有用。
function fetchInput(identifier) {
var form_data = identifier.serialize().split('&');
var input = {};
$.each(form_data, function(key, value) {
var data = value.split('=');
input[data[0]] = decodeURIComponent(data[1]);
});
return input;
}
答案 5 :(得分:2)
我现在没有回答你的答案,但我的猜测是你要序列化并发送回服务器,然后使用序列化数据,这就是你必须反序列化的原因?
如果是这种情况,你应该考虑使用.serializeArray()。您可以将其作为POST数据发送到ajax中,然后再访问,因为您将拥有对象。
答案 6 :(得分:0)
可能有点晚了,但也许你正在寻找像JQuery.deserialize这样的东西。问题:不支持复选框或单选按钮。
答案 7 :(得分:0)
使用Jack Allan的 deparam 函数和jQuery,你可以改变这一行:
map[key] = value;
到
$('input[name=' + key + ']').val(value);
将数据加载回表单字段。
答案 8 :(得分:0)
当序列化字符串
中多次发现相同的键时,此代码返回一个数组
chaine="single=Single1&multiple=Multiple&multiple=Multiple1&multiple=Multiple2&multiple=Multiple3&check=check2&radio=radio1"
function deserialize(txt){
myjson={}
tabparams=chaine.split('&')
var i=-1;
while (tabparams[++i]){
tabitems=tabparams[i].split('=')
if( myjson[decodeURIComponent(tabitems[0])] !== undefined ){
if( myjson[decodeURIComponent(tabitems[0])] instanceof Array ){
myjson[decodeURIComponent(tabitems[0])].push(decodeURIComponent(tabitems[1]))
}
else{
myjson[decodeURIComponent(tabitems[0])]= [myjson[decodeURIComponent(tabitems[0])],decodeURIComponent(tabitems[1])]
}
}
else{
myjson[decodeURIComponent(tabitems[0])]=decodeURIComponent(tabitems[1]);
}
}
return myjson;
}
答案 9 :(得分:0)
需要一个字符串,可以存储在COOKIE中,然后读取并用输入值填充相同的表格。
输入元素分隔符:〜 (使用任何分隔符)
输入属性分隔符: | (使用任何分隔符)
输入类型 | 输入名称 | 输入值〜 input2 type | input2 name | < / b> input2值
var formData = '';
$('#form_id').find('input, textarea, select').each(function(i, field) {
formData += field.type+'|'+field.name+'|'+field.value+'~';
});
示例:
hidden|vote_id|10~radio|option_id|~radio|option_id|427~radio|option_id|428~
答案 10 :(得分:0)
如果你想要的是删除标准的URL编码表示法,你可以使用JavaScript decodeURIComponent(),这将为你提供一个常规字符串,就像这样:
var decodedString = decodeURIComponent("Http%3A%2F%2FHello%3AWorld");
alert(decodedString);
在这种情况下,decodeString看起来像Http://Hello:World
,这里是working fiddle。
所有这些都搜索到同样的问题,并在此处找到答案:How can I decode a URL with jQuery?
我知道这是一个老问题,但是对jQuery反序列化进行一些搜索让我在这里,所以我不妨试着为那些遇到同样问题的人提供不同的方法。