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 相关文章推荐
jQuery 浮动广告实现代码
Dec 25 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
Apr 06 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
May 23 Javascript
浅谈javascript的Touch事件
Sep 27 Javascript
js父页面中使用子页面的方法
Jan 09 Javascript
JavaScript实现的MD5算法完整实例
Feb 02 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
Jul 10 Javascript
js重写方法的简单实现
Jul 10 Javascript
AngularJS监听ng-repeat渲染完成的方法
Mar 20 Javascript
vue车牌号校验和银行校验实战
Jan 23 Javascript
vue页面更新patch的实现示例
Mar 25 Javascript
详解elementUI中input框无法输入的问题
Apr 27 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 shell命令合并图片的代码
2011/06/23 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
jquery对表单操作2
2011/04/06 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
javascript学习总结之js使用技巧
2015/09/02 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
微信小程序左右滑动切换页面详解及实例代码
2017/02/28 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
Python将xml和xsl转换为html的方法
2015/03/10 Python
python 循环while和for in简单实例
2016/08/16 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
苹果台湾官网:Apple台湾
2019/01/05 全球购物
党员培训思想汇报
2014/01/07 职场文书
数字化校园建设方案
2014/05/03 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
2014司机年终工作总结
2014/12/05 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
Python实现byte转integer
2021/06/03 Python
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
2022/06/14 MySQL