zoukankan      html  css  js  c++  java
  • JQuery.Ajax()的data参数类型

    $('#submit').click(function(){
    $('#form').serialize(); //会根据input里面的name,把数据序列化成字符串;eg:name=yang
    $('#form').serializeArray(); //会根据input里面的name,把数据序列化成数组;eg:[object]
      //注意:没有name会获取不到值


    //下面两种不是jQuery的方法
    JSON.parse() //json字符串转化为json对象
    JSON.stringify() //json对象转化为json字符串
    });

    假如现在有这样一个表单,是添加元素用的。

    <form id='addForm' action='UserAdd.action' type='post'>
         <label for='uname'>用户名</label>:<input type='text' name='uname' id='uname'><br>
         <label for='mobileIpt'>手机号:</label><input type='text' name='mobileIpt' id='mobileIpt'><br>
         <label for='birthday'>生日:</label><input type='text' name='birthday'><br>
         <input type='button' value='提交' onclick='addUser()'>
    </form>

    我们不想使用表单submit的方式添加这个元素,我们就想使用ajax提交。

    以前我们是这样实现的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function addUser(){
            var user = {
                uname:$("#uname").val(),
                mobileIpt:$("#mobileIpt").val(),
                birthday:$("#birthday").val()
            };
            $.ajax({
                url:'UserAdd.action',
                data:user,
                type:'post',
                dataType:'text',
                success:function(msg){
                    if(msg=='1'){
                        console.log('添加成功');
                    }else{
                        console.log('添加失败')
                    }
                }
                 
            })
        }

    这没有什么错,就是获取表单元素的值实在是太麻烦....这里只有三项,很多项的时候就废了....

    直到有一天,我发现了jquery的serializeArray方法

    序列化表格元素 (类似 '.serialize()' 方法) 返回 JSON 数据结构数据。
    注意,此方法返回的是JSON对象而非JSON字符串。需要使用插件或者第三方库进行字符串化操作。
    返回的JSON对象是由一个对象数组组成的,其中每个对象包含一个或两个名值对——name参数和value参数(如果value不为空的话)。

    我们来试试看

    复制代码
    $('#addForm').serializeArray();
    //返回数据结构,是json数组,每个对像分别name和value为key,代表这个表单元素的name和value
    [
        {"name":"uname","value":""},
        {"name":"mobileIpt","value":""},   
        {"name":"birthday","value":""}
    ]
    复制代码

    这个貌似用不上啊

    我们使用JQuery.param()方法处理一下:

    var arr = $('#addForm').serializeArray();
    $.param(arr);
    
    "uname=alice&mobileIpt=110&birthday=1983-05-12"

    嘿这下符合我们的需求了吧,虽然不是json类型,但是至少可以作为data上传了。

    这里我们可以直接在ajax的data处填上这个json数组,在jquery内部自己调用$.param()处理的。

    我们来看下jquery.param()方法的说明:

    复制代码
    返回值:StringjQuery.param(obj,[traditional])
    将表单元素数组或者对象序列化。
    
    参数
    obj,[traditional]
    数组或jQuery对象会按照name/value对进行序列化,普通对象按照key/value对进行序列化。
    traditional:是否使用传统的方式浅层序列化。
    
    demo:
    $.param({uanme:'vic',mobileIpt:'110',birthday:'2013-11-11'});
    "uanme=vic&mobileIpt=110&birthday=2013-11-11"
    复制代码

    看着说明,貌似也跟我们没关系啊,我们换一个json数组来看

    $.param([{uanme:'vic'},{mobileIpt:'110'},{birthday:'2013-11-11'}]);
    "undefined=&undefined=&undefined="

    这个转换不成功了吧,为什么我们表单的那种数据能够成功转换成url参数呢?我们来看下jquery源码

    复制代码
    //在ajax()方法中,对json类型的数据进行了$.param()处理
    if ( s.data && s.processData && typeof s.data !== "string" ) {
        s.data = jQuery.param( s.data, s.traditional );
    }
    
    //param方法中
    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 );
            }
        }
    复制代码

    这下明白了吧,如果是json数据,那么挨个循环,只取他们的name属性和value属性拼接字符串。

    如果是普通对象,循环该对象的属性,然后拼接字符串。

    总结:

    所以,本文要说的是,在jquery的ajax函数中,可以传入3种类型的数据

    1.文本:"uname=alice&mobileIpt=110&birthday=1983-05-12"

    2.json对象:{uanme:'vic',mobileIpt:'110',birthday:'2013-11-11'}

    3.json数组:

    [
        {"name":"uname","value":"alice"},
        {"name":"mobileIpt","value":"110"},   
        {"name":"birthday","value":"2012-11-11"}
    ]
    所以,我们可以一键获取表单并提交,非常方便。

    补充:
    其实提取表单数据的话只需要serialize()方法直接获取"uname=alice&mobileIpt=110&birthday=1983-05-12"这样的就可以了。
  • 相关阅读:
    了解 NoSQL 的必读资料
    关于什么时候用assert(断言)的思考
    这次见到了一些大侠
    NetBeans 时事通讯(刊号 # 87 Jan 12, 2010)
    动态链接库dll,静态链接库lib, 导入库lib
    新女性十得 写得了代码,查得出异常
    记录系统乱谈
    新女性十得 写得了代码,查得出异常
    fullpage.js禁止滚动
    RunningMapReduceExampleTFIDF hadoopclusternet This document describes how to run the TFIDF MapReduce example against ascii books. This project is for those who wants to experiment hadoop as a skunkworks in a small cluster (110 nodes) Google Pro
  • 原文地址:https://www.cnblogs.com/Alex80/p/6192439.html
Copyright © 2011-2022 走看看