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 相关文章推荐
js下关于onmouseout、事件冒泡的问题经验小结
Dec 09 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
Jan 11 Javascript
JavaScript 代码压缩工具小结
Feb 27 Javascript
详解JavaScript中getFullYear()方法的使用
Jun 10 Javascript
jQuery实现两款有动画功能的导航菜单代码
Sep 16 Javascript
Angular实现form自动布局
Jan 28 Javascript
jQuery获取table行数并输出单元格内容的实现方法
Jun 30 Javascript
Vue实现选择城市功能
May 27 Javascript
详解基于vue-cli优化的webpack配置
Nov 06 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
Aug 30 Javascript
js实现拖拽与碰撞检测
Sep 18 Javascript
ES6的循环与可迭代对象示例详解
Jan 31 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分页时出现的Fatal error的解决方法
2011/04/18 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
web 页面分页打印的实现
2009/06/22 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
2015/03/04 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python 中的列表解析和生成表达式
2011/03/10 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
利用python爬取有道词典的方法
2020/12/08 Python
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
记帐员岗位责任制
2014/02/08 职场文书
体育活动总结范文
2014/05/04 职场文书
我的中国梦演讲稿1000字
2014/08/19 职场文书
党员剖析材料范文
2014/12/18 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
Python使用MapReduce进行简单的销售统计
2022/04/22 Python
mysql数据库实现设置字段长度
2022/06/10 MySQL