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 相关文章推荐
List the UTC Time on a Computer
Jun 11 Javascript
js 操作select和option常用代码整理
Dec 13 Javascript
键盘KeyCode值列表汇总
Nov 26 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
Nov 30 Javascript
基于Bootstrap实现tab标签切换效果
Apr 15 Javascript
jQuery Ajax 全局调用封装实例代码详解
Jun 02 Javascript
无法获取隐藏元素宽度和高度的解决方案
Mar 07 Javascript
字太多用...代替的方法(两种)
Mar 15 Javascript
vue-router+nginx 非根路径配置方法
Jun 30 Javascript
详解vue-router导航守卫
Jan 19 Javascript
Vue路由管理器Vue-router的使用方法详解
Feb 05 Javascript
JavaScript实现音乐播放器
Aug 14 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
十天学会php之第二天
2006/10/09 PHP
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
javascript 事件处理程序介绍
2012/06/27 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
Javascript实现滑块滑动改变值的实现代码
2013/04/12 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
浅谈jquery fullpage 插件增加头部和版权的方法
2018/03/20 jQuery
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
一则python3的简单爬虫代码
2014/05/26 Python
Python lambda和Python def区别分析
2014/11/30 Python
Python随机生成数模块random使用实例
2015/04/13 Python
python 中split 和 strip的实例详解
2017/07/12 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
keras输出预测值和真实值方式
2020/06/27 Python
python selenium 获取接口数据的实现
2020/12/07 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
采购类个人求职的自我评价
2014/02/18 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
毕业赠语大全
2015/06/23 职场文书
感恩教师节主题班会
2015/08/12 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书