JQuery中Ajax()的data参数类型实例分析


Posted in Javascript onDecember 15, 2015

本文实例分析了JQuery中Ajax()的data参数类型。分享给大家供大家参考,具体如下:

前面简单分析介绍了《ajax中data传参的两种方式》,对于ajax参数传递方式有了初步的了解,这里就来进一步分析一下ajax中data参数的类型。

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

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

希望本文所述对大家jQuery程序设计有所帮助。

Javascript 相关文章推荐
关于使用runtimeStyle属性问题讨论文章
Mar 08 Javascript
JavaScript中的作用域链和闭包
Jun 30 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
Jan 07 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
Mar 30 Javascript
PhotoSwipe异步动态加载图片方法
Aug 25 Javascript
js canvas实现擦除效果示例代码
Apr 26 Javascript
解决VUEX刷新的时候出现数据消失
Jul 03 Javascript
200行HTML+JavaScript实现年会抽奖程序
Jan 22 Javascript
Layui Table js 模拟选中checkbox的例子
Sep 03 Javascript
Vue Components 数字键盘的实现
Sep 18 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
Oct 31 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
Feb 10 Javascript
理解javascript闭包
Dec 15 #Javascript
jQuery检测滚动条是否到达底部
Dec 15 #Javascript
js实现根据身份证号自动生成出生日期
Dec 15 #Javascript
浅析javascript的return语句
Dec 15 #Javascript
轻松学习Javascript闭包函数
Dec 15 #Javascript
Javascript基于AJAX回调函数传递参数实例分析
Dec 15 #Javascript
javascript实现html页面之间参数传递的四种方法实例分析
Dec 15 #Javascript
You might like
用libtemplate实现静态网页生成
2006/10/09 PHP
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
ThinkPHP关于session的操作方法汇总
2014/07/18 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
2015/06/08 Javascript
Javascript实现单例模式
2016/01/24 Javascript
原生js编写autoComplete插件
2016/04/13 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
javascript canvas实现简易时钟例子
2020/09/05 Javascript
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
简单易懂的python环境安装教程
2017/07/13 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
python pip如何手动安装二进制包
2020/09/30 Python
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
Shell脚本如何向终端输出信息
2014/04/25 面试题
剪枝的学问教学反思
2014/02/07 职场文书
聘用意向书范本
2014/04/01 职场文书
会议主持人开场白台词
2015/05/28 职场文书
趣味运动会标语口号
2015/12/26 职场文书
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技