JQuery.Ajax()的data参数类型实例详解


Posted in Javascript onNovember 20, 2015

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

<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提交。

以前我们是这样实现的:

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"这样的就可以了。

ps:jquery中ajax方法data参数的用法小结

$.ajax({
  type: post,
  url: some.php,
  data: name=john&location=boston, //第一种方式传参
 // data: {name:john,location:boston} //第二种方式传参
 // data: {foo:[bar1, bar2]} 转换为 '&foo=bar1&foo=bar2'
 /*
 第一种我们用url传参,参数里面如果加带&这个符号地话,可能参数接收不到或不完整,
 如“ data: name=john&location=boston,” 如果name地值是john&smith这样写可能就会有问题,
 我们可以用js里面地encodeuricomponent()方法进行转义,
 但如果用data: {name:john,location:boston}这种方式写地话就不需要进行转义,
 如果转义地话,接收地将是转义后地字符串
 */
  success: function(msg){
   alert( data saved: + msg );
  }
});
Javascript 相关文章推荐
阻止子元素继承父元素事件具体思路及实现
May 02 Javascript
js冒泡法和数组转换成字符串示例代码
Aug 14 Javascript
js调试系列 源码定位与调试[基础篇]
Jun 18 Javascript
JavaScript实现的使用键盘控制人物走动实例
Aug 27 Javascript
javascript使用call调用微信API
Dec 15 Javascript
理解AngularJs指令
Dec 10 Javascript
JS模仿手机端九宫格登录功能实现代码
Apr 28 Javascript
原生JS实现网络彩票投注效果
Sep 25 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
Apr 13 Javascript
微信小程序常用简易小函数总结
Feb 01 Javascript
微信小程序实现类似微信点击语音播放效果
Mar 30 Javascript
使用zrender.js绘制体温单效果
Oct 31 Javascript
Jquery Ajax Error 调试错误的技巧
Nov 20 #Javascript
jQuery实现简单的文件上传进度条效果
Mar 26 #Javascript
jquery实现手风琴效果
Nov 20 #Javascript
不想让浏览器运行javascript脚本的方法
Nov 20 #Javascript
jquery背景跟随鼠标滑动导航
Nov 20 #Javascript
JavaScript获取浏览器信息的方法
Nov 20 #Javascript
JavaScript性能优化之小知识总结
Nov 20 #Javascript
You might like
数字转英文
2006/12/06 PHP
php jquery 多文件上传简单实例
2013/12/23 PHP
PHP全局变量与超级全局变量区别分析
2016/04/01 PHP
用JAVASCRIPT如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
2007/04/20 Javascript
JavaScript 无符号右移运算符
2009/04/17 Javascript
jquery 经典动画菜单效果代码
2010/01/26 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
实例详解vue中的$root和$parent
2019/04/29 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
python实现删除文件与目录的方法
2014/11/10 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
python修改txt文件中的某一项方法
2018/12/29 Python
在python中实现强制关闭线程的示例
2019/01/22 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
Django中自定义admin Xadmin的实现代码
2019/08/09 Python
python中的global关键字的使用方法
2019/08/20 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
Python创建数字列表的示例
2019/11/28 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
水污染治理专业毕业生推荐信
2013/11/14 职场文书
化妆师职业生涯规划书
2014/02/16 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
签订劳动合同通知书
2015/04/16 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
爱国之歌(8首)
2019/09/29 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL