Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery反序列化表单_Javascript_Jquery_Deserialization - Fatal编程技术网

Javascript jQuery反序列化表单

Javascript jQuery反序列化表单,javascript,jquery,deserialization,Javascript,Jquery,Deserialization,我正在使用序列化我的表单元素,并希望将它们反序列化回来。很遗憾,找不到任何工作的jQuery反序列化程序,有什么建议吗 jQuery Serialize的一半是,因此反序列化查询字符串的东西的一半将是deparam。不幸的是,我还没有找到一个好的独立的deparam。目前,我建议您获取并使用。如果你不需要其他东西,你可以把它们拿走。我在某个地方读到,本·阿尔曼·牛仔计划将德帕兰提取到它自己的模块中 对于反序列化的其余部分,您只需要循环遍历deparam返回的对象,对于对象中的每个键和值对,根据键

我正在使用序列化我的表单元素,并希望将它们反序列化回来。很遗憾,找不到任何工作的jQuery反序列化程序,有什么建议吗

jQuery Serialize的一半是,因此反序列化查询字符串的东西的一半将是deparam。不幸的是,我还没有找到一个好的独立的deparam。目前,我建议您获取并使用。如果你不需要其他东西,你可以把它们拿走。我在某个地方读到,本·阿尔曼·牛仔计划将德帕兰提取到它自己的模块中


对于反序列化的其余部分,您只需要循环遍历deparam返回的对象,对于对象中的每个键和值对,根据键选择表单元素,然后将form elements值设置为该值。

我现在不回答您的问题,但我猜您希望将其序列化并发送回服务器,然后使用序列化的数据,这就是您必须对其进行反序列化的原因


如果是这样的话,你应该考虑使用.SerialZielEAR。您可以在ajax中将其作为POST数据发送,然后也可以稍后访问,因为您将拥有一个对象

可能有点晚了,但也许你正在寻找类似的东西。问题:不支持复选框或单选按钮。

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

尝试以下操作:

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;
}
通过jQuery使用Jack Allan的deparam函数,可以更改此行:

map[key] = value;


这将把数据加载回表单字段。

当在序列化字符串中多次发现相同的键时,此代码将返回一个数组


    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;
    }

我对尝试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);
var decodedString = decodeURIComponent("Http%3A%2F%2FHello%3AWorld");
alert(decodedString);
其中数据是一个参数列表,例如$myform.serialize将生成的内容

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

$("select").deserialize(data);
需要在一个字符串中存储所有内容,该字符串可以存储在COOKIE中,然后读取并用输入值填充同一表单

输入元素分隔符:~使用任何分隔符

输入属性分隔符:|使用任何分隔符

输入类型|输入名称|输入值~输入类型|输入名称|输入值

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~

如果您想要删除标准的URL编码符号,可以使用JavaScript,它将为您提供一个常规字符串,如下所示:

$("#myform").deserialize(data);
var decodedString = decodeURIComponent("Http%3A%2F%2FHello%3AWorld");
alert(decodedString);
在这种情况下,decodedString看起来像Http://Hello:World,这里有一个

通过对同一问题的搜索,在这里找到了答案:


我知道这是一个老问题,但对jQuery反序列化进行一些搜索让我来到了这里,因此我不妨尝试为有相同问题的人提供一种不同的方法。

这一点有点晚了,但有人可能会发现这很有用

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;
}

你需要提供更多的信息。是否要在服务器上反序列化它们?在这种情况下,如果您告诉我们您使用的是什么,会很有帮助吗?Rails、PHP、ASP.net、Java?抱歉,我忘了添加我想使用JS在客户端反序列化数据的内容。这是一个很棒的插件!谢谢你提出一个。插件太棒了!谢谢,嘿,伙计。非常棒的插件我只是想知道你的插件是否提供了一种方法,我可以反序列化一个序列化的数组并将其存储在一个变量中谢谢,它对meSimple非常有用+1我们好!谢谢函数decodeURIComponent在将+plus转换为``空格时不知何故失败了。必须添加一些正则表达式来正确处理plus/space。@David162795,没错。当我使用这个函数时,我自己就已经解决了这个问题:params.replace/\+/g,%20我从未将它添加到函数中,因为我不是100%确定它在所有情况下都能工作,尽管我从未想过它会成为一个问题。这是您使用的同一个正则表达式吗?此函数反序列化为文档中的所有元素,用匹配的名称重置所有复选框和字段。如果反序列化空字符串,它还将重置页面中所有输入的空名称值。@TiGR,其目的是执行与序列化函数相反的函数。如果执行$myform.deserializedata,则会影响表单中的所有字段,而不是文档中的所有字段,如您所述。但您也可以传递任何选择器以仅影响特定字段。我刚刚更新了答案,澄清了这一点。这对于一维数组来说已经足够好了;我将更改输入[decodeURIComponentdata[0]]=。。。所以
y名称,如用户[]和地址[billing]也得到了正确的解码。尽管我刚才注意到它与动态字段(如customers[])不太匹配,在这些动态字段中,当服务器使用时,可能会有多个字段生成数组。