(轉)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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM