jQuery反序列化表单

Tom*_*mas 39 javascript jquery deserialization

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

kfl*_*nce 59

我编写了一个jQuery.deserialize版本,它支持从serialize,serializeArray和serializeObject函数生成的序列化数据.它还支持所有表单元素类型,包括复选框和单选按钮.

  • 那是一个非常棒的插件!谢谢你想出一个. (6认同)

Jac*_*lan 24

试试这个:

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;
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*ond 20

我对尝试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;
};
Run Code Online (Sandbox Code Playgroud)

你应该能够像这样使用它:

$("#myform").deserialize(data);
Run Code Online (Sandbox Code Playgroud)

数据是一个参数列表,例如$("#myform").serialize()会产生什么.

它会影响表单中的所有字段,并清除数据中未包含的字段的值.但您也可以传递任何选择器以仅影响特定字段,就像使用序列化函数一样.例如:

$("select").deserialize(data);
Run Code Online (Sandbox Code Playgroud)


Ben*_*kin 9

jQuery Serialize的一半是param(),因此反序列化查询字符串的一半将成为一个deparam.不幸的是,我找不到一个好的独立deparam.现在我建议使用jQuery BBQ库并使用它.如果你不需要其他东西,你可以删除它们.我在某地读过Ben Alman(牛仔)计划将deparam提取到自己的模块中.

对于反序列化的其余部分,您只需要遍历deparam返回的对象以及对象中的每个键和值对,根据键选择表单元素,并将表单元素值设置为值.


小智 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;
}
Run Code Online (Sandbox Code Playgroud)