(转)jquery serialize表单序列化,当radio或checkbox 未选中时,没有序列化到对象中的原因分析和解决方案 - ghostsf...

相信很多人都用过jq的表单序列化serialize()方法,因为这能很方便地帮你把表单里所有的非禁用输入控件序列化为 key/value 对象,不需要你再去一个个地拼接参数了。

这是一个很好用的函数,用过的你肯定知道。但是ghostsf最近发现一个小bug(也许不应该叫bug,姑且称之)。就是当radio或checkbox 未选中时,没有序列化到对象中。

什么原因呢?下面分析之:
瞄一眼源码:From jQuery JavaScript Library v2.1.4

jQuery.fn.extend({
    serialize: function() {
        return jQuery.param( this.serializeArray() );
    },
    serializeArray: function() {
        return this.map(function() {
            // Can add propHook for "elements" to filter or add form elements
            var elements = jQuery.prop( this, "elements" );
            return elements ? jQuery.makeArray( elements ) : this;
        })
        .filter(function() {
            var type = this.type;
            // Use .is( ":disabled" ) so that fieldset[disabled] works
            return this.name && !jQuery( this ).is( ":disabled" ) &&
                rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
                ( this.checked || !rcheckableType.test( type ) );
        })
        .map(function( i, elem ) {
            var val = jQuery( this ).val();
            return val == null ?
                null :
                jQuery.isArray( val ) ?
                    jQuery.map( val, function( val ) {
                        return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
                    }) :
                    { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        }).get();
    }
});

不得不说代码写得很凝练。我们可以看到我们调用的serialize(),其实是走的param()方法,这个方法查阅jq手册即可得知,其作用是将数组或对象序列化为一个 key/value 对象。

显然这个方法不是我们要看的,重点就是serializeArray()了。
简单看下代码(只是简单看了下并未严格测试校验,可能有缺漏)。可以看到map里对于val的处理,判断到是数组的时候jQuery.isArray( val ) ?直接使用map进行了遍历,这个时候如果这个数组的length是0呢?那么自然当radio或checkbox 未选中时,这边的数组长度是为0的,所以这里就把radio或checkbox给漏掉了。

那么怎么解决呢?直接改源码?这也太粗暴了吧。

ghostsf心血来潮写了一个jq拓展,代码如下:(并不要脸地命名为ghostsf_serialize):

//为jquery.serializeArray()解决radio,checkbox未选中时没有序列化的问题
    $.fn.ghostsf_serialize = function () {
        var a = this.serializeArray();
        var $radio = $('input[type=radio],input[type=checkbox]', this);
        var temp = {};
        $.each($radio, function () {
            if (!temp.hasOwnProperty(this.name)) {
                if ($("input[name='" + this.name + "']:checked").length == 0) {
                    temp[this.name] = "";
                    a.push({name: this.name, value: ""});
                }
            }
        });
        //console.log(a);
        return jQuery.param(a);
    };

怎么使用呢?
引入即可,然后就是你常用的

$(form).ghostsf_serialize()

了。

这样就很轻松地解决此问题了。自己动手丰衣足食。

 

转自:http://www.ghostsf.com/tools/389.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#,实现对象序列化到文件或数据库,然后在下次启动或恢复重新加载可以通过以下步骤来完成: 1. 标记类为可序列化:首先,确保你要序列化的类或结构体被标记为可序列化,即在类的声明前加上 `[Serializable]` 特性。 ```csharp [Serializable] public class MyClass { // 类的成员和方法 } ``` 2. 序列化对象:创建一个 `FileStream` 或 `MemoryStream` 对象,然后使用 `BinaryFormatter` 类将对象序列化到流。你可以选择将序列化的流保存到文件或数据库。 ```csharp // 创建一个文件流 using (FileStream fileStream = new FileStream("data.bin", FileMode.Create)) { // 创建 BinaryFormatter 对象并将对象序列化到文件流 BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fileStream, myObject); } ``` 3. 反序列化对象:在下次启动或恢复,你可以使用相同的方法从文件或数据库读取序列化的流,并使用 `BinaryFormatter` 类将流反序列化对象。 ```csharp // 创建一个文件流 using (FileStream fileStream = new FileStream("data.bin", FileMode.Open)) { // 创建 BinaryFormatter 对象并从文件流序列化对象 BinaryFormatter formatter = new BinaryFormatter(); MyClass myObject = (MyClass)formatter.Deserialize(fileStream); // 在下次启动或恢复,myObject 已经包含了之前保存的对象状态 } ``` 这样,通过将对象序列化到文件或数据库,然后在下次启动或恢复序列化,你可以重新加载之前保存的对象状态。 需要注意的是,序列化和反序列化的过程对象的类型必须保持一致,否则可能会导致反序列化失败或数据丢失。此外,如果对象包含引用类型的成员变量,则这些引用类型也需要是可序列化的。 希望这能回答你的问题!如果还有其他疑问,请随提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值