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 相关文章推荐
JavaScript中的事件处理
Jan 16 Javascript
jQuery之$(document).ready()使用介绍
Apr 05 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
Jan 25 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
Apr 08 Javascript
js 左右悬浮对联广告特效代码
Dec 12 Javascript
JavaScript中SetInterval与setTimeout的用法详解
Nov 10 Javascript
js 获取元素所有兄弟节点的实现方法
Sep 06 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
Sep 19 Javascript
JavaScript仿聊天室聊天记录
Dec 27 Javascript
慕课网题目之js实现抽奖系统功能
Sep 19 Javascript
node内置调试方法总结
Feb 22 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
Sep 11 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
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
使两个iframe的高度与内容自适应,且相等
2006/11/20 Javascript
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
firefox下input type=&quot;file&quot;的size是多大
2011/10/24 Javascript
javascript获取web应用根目录的方法
2014/02/12 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
node.js中的console用法总结
2014/12/15 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
Vue退出登录时清空缓存的实现
2019/11/12 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
为什么需要版本控制
2016/10/28 面试题
自荐信如何“自荐”
2013/10/24 职场文书
三方合作协议书范本
2014/04/18 职场文书
小学雷锋月活动总结
2014/07/03 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
Python趣味挑战之教你用pygame画进度条
2021/05/31 Python
SpringBoot集成Redis的思路详解
2021/10/16 Redis
Nginx 常用配置
2022/05/15 Servers