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解析json数据
Dec 09 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
Aug 11 Javascript
JS实现简单的二元方程计算器功能示例
Jan 03 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
Jul 03 Javascript
vue2实现可复用的轮播图carousel组件详解
Nov 27 Javascript
JS中promise化微信小程序api
Apr 12 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
Feb 19 Javascript
JS实现给数组对象排序的方法分析
Jun 24 Javascript
基于JavaScript实现单例模式
Oct 30 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
Jul 22 Javascript
Ajax请求超时与网络异常处理图文详解
May 23 Javascript
什么是SOLID
Mar 24 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 escape URL编码
2008/12/10 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
php中Snoopy类用法实例
2015/06/19 PHP
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
Python中文件操作简明介绍
2015/04/13 Python
简单理解Python中基于生成器的状态机
2015/04/13 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
python实现贪吃蛇游戏
2020/03/21 Python
python绘制规则网络图形实例
2019/12/09 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
前厅部经理岗位职责范文
2014/02/04 职场文书
给公司的建议书范文
2014/05/13 职场文书
高效课堂标语
2014/06/26 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
五四青年节活动总结
2015/02/10 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书