zoukankan      html  css  js  c++  java
  • jQuery源码中的Ajax--serialize()/serializeArray()/param()方法

      由于jQueryObject.serialize()方法的核心是$.param()方法,所以先学习$.param()方法。

    一、$.param()方法

      $.param()方法是用来对一个数组或对象按照key/value进行序列化,以便用于URL查询字符串或AJAX请求。其返回的字符串已经过URL编码处理(采用的字符集为UTF-8)。

      语法:

    jQuery.param( obj [, traditional ] )

      参数如下:

    参数描述
    obj 需要被序列化的JS对象。
    traditional 指示是否执行一个传统的"浅层"序列化。

      对于参数traditional可以查看:http://www.365mini.com/page/jquery_param.htm

      示例:

    var obj = {
            a:1,
            b:2,
            c:3
            };
    var k = $.param(obj);
    alert(k);

      返回结果:

      $.param()方法的源代码:(路径:jquery/src/serialize.js

    // Serialize an array of form elements or a set of
    // key/values into a query string
    jQuery.param = function( a, traditional ) {
        var prefix,
            s = [],
            add = function( key, valueOrFunction ) {
    
                // If value is a function, invoke it and use its return value
                var value = jQuery.isFunction( valueOrFunction ) ?
                    valueOrFunction() :
                    valueOrFunction;
    
                s[ s.length ] = encodeURIComponent( key ) + "=" +
                    encodeURIComponent( value == null ? "" : value );
            };
    
        // If an array was passed in, assume that it is an array of form elements.
        if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
    
            // Serialize the form elements
            jQuery.each( a, function() {
                add( this.name, this.value );
            } );
    
        } else {
    
            // If traditional, encode the "old" way (the way 1.3.2 or older
            // did it), otherwise encode params recursively.
            for ( prefix in a ) {
                buildParams( prefix, a[ prefix ], traditional, add );
            }
        }
    
        // Return the resulting serialization
        return s.join( "&" );
    };

      在这部分代码中:

    • 判断是使用传统方式序列化还是非传统方式序列化,若是传统则调用buildParams方法。
    • 序列化每一项幷存放到字符串数组里
    • 最后以符号“&”串联字符串数据

    二、jQueryObject.serializeArray()方法

      jQueryObject.serializeArray()方法是用来序列化一组表单元素,将表单内容编码为一个JavaScript数组。常用于将表单内容序列化为JSON对象,以便于被编码为JSON格式的字符串。  

      语法:

    jQueryObject.serializeArray( )

      示例:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <meta charset="utf-8">
        <script type="text/javascript" src="http://libs.useso.com/js/jquery/1.7.2/jquery.min.js"></script>
        <script type="text/javascript">
            $(function(){
                $("#send").on("click",function() {
                    var fields = $("form1").serializeArray();
                    console.log(fields);
                });
    
            });
            
        </script>
    </head>
    <body>
        <form id="form1" action="#">
            <p>评论:</p>
            <p>姓名:<input type="text" name="username" id="username"/></p>
            <p>内容:<textarea name="content" id="content" rows="2" cols="20"></textarea></p>
            <p><input type="button" id="send" value="提交"></p>
        </form>
    </body>
    </html>

      返回结果:

      jQueryObject.serializeArray()方法的源代码:(链接:jquery/src/serialize.js)

      这块粘贴大神的代码注释:(链接:http://blog.csdn.net/liangklfang/article/details/49661023)

    serializeArray: function() {
            //如果有elements那么获取该元素的elements,否则还是自身!
            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;
                //filter方法里面已经是DOM元素了
                // Use .is(":disabled") so that fieldset[disabled] works
                //必须有name属性,同时该元素不是隐藏的元素,同时nodeName必须是input/select/textarea/kengen元素
                //同时该元素的type类型必须不是sumbit/button/image/reset/file类型,而且该元素的checked属性必须存在
                //如果checkded不存在,那么该元素类型必须不是checkbox/radio类型
                return this.name && !jQuery( this ).is( ":disabled" ) &&
                    rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
                    ( this.checked || !rcheckableType.test( type ) );
            })
            .map(function( i, elem ) {
                //这里面真正对元素进行处理
                //获取该元素的值,如果值是null那么返回的值就是null
                //如果该元素的值存在,同时如果该值是一个数组,那么对
                //该元素的值进行迭代,放入一个对象当中,name是元素的名称,键值是元素的值,不过该值要取值回车换行!
                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, "
    " ) };
                        }) :
                        { name: elem.name, value: val.replace( rCRLF, "
    " ) };
            }).get();
        }

    三、jQueryObject.serialize()方法

    • serialize()函数用于序列化一组表单元素,将表单内容编码为用于提交的字符串。
    • serialize()函数常用于将表单内容序列化,以便用于AJAX提交。
    • 该函数主要根据用于提交的有效表单控件的name和value,将它们拼接为一个可直接用于表单提交的文本字符串,该字符串已经过标准的URL编码处理(字符集编码为UTF-8)。

      语法:

    jQueryObject.serialize( )

      示例:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <meta charset="utf-8">
        <script type="text/javascript" src="http://libs.useso.com/js/jquery/1.7.2/jquery.min.js"></script>
        <script type="text/javascript">
            $(function(){
                $("#send").on("click",function() {
                    //var fields = $("#form1").serializeArray();
                    var result = $("#form1").serialize();
                    console.log(result);
                });
            });
        </script>
    </head>
    <body>
        <form id="form1" action="#">
            <p>评论:</p>
            <p>姓名:<input type="text" name="username" id="username"/></p>
            <p>内容:<textarea name="content" id="content" rows="2" cols="20"></textarea></p>
            <p><input type="button" id="send" value="提交"></p>
        </form>
    </body>
    </html>

      结果如下:

      jQueryObject.serialize()方法的源码如下:

    serialize: function() {
            return jQuery.param( this.serializeArray() );
        }

      *所以jQueryObject.serialize()的整个过程就是:先调用jQueryObject.serializeArray()方法把jQueryObject编码为一个JavaScript数组,然后对这个数据调用jQuery.param()方法进行序列化,返回一个经过URL编码处理的字符串。

      *jQuery.param()是全局函数,jQueryObject.serializeArray()、jQueryObject.serialize()属于jQuery对象。

  • 相关阅读:
    Spring IOC
    MyBatis环境搭建
    Spring AOP
    DWR在Spring中应用
    利用反射自动封装成实体对象
    Spring源码下载
    You need to use a Theme.AppCompat theme (or descendant) with this activity解决方法
    由于未能创建 Microsoft Visual C# 2010 编译器,因此未能打开项目 "xxx" ”的解决方法
    正则表达式
    安卓模拟器里面的cpu/abi里面有AMD、intel x86、mlps应该选择哪个
  • 原文地址:https://www.cnblogs.com/niulina/p/5689891.html
Copyright © 2011-2022 走看看