jQuery反序列化表单

时间:2011-08-09 07:11:58

标签: javascript jquery deserialization

我正在使用jQuery Serialize来序列化我的表单元素,并希望将它们反序列化。不幸的是找不到任何有效的jQuery反序列化器,有什么建议吗?

11 个答案:

答案 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反序列化进行一些搜索让我在这里,所以我不妨试着为那些遇到同样问题的人提供不同的方法。