jQuery.param( obj, traditional )

为url查询或者ajax 将对象或者数组转为url参数或ajax参数,是挂在jQuery对象上的静态方法,有码有真相:

  1. var myInfo = {
  2. userid:'123',
  3. fullname:['henry','li'],
  4. intro:{html:5, css:3}
  5. };
  6. console.log($.param(myInfo));
  7. //"userid=123&fullname%5B%5D=henry&fullname%5B%5D=li&intro%5Bhtml%5D=5&intro%5Bcss%5D=3"
  8. //userid=123&fullname[]=henry&fullname[]=li&intro[html]=5&intro[css]=3"
  9. console.log($.param(myInfo),true);
  10. //"a=%5Bobject+Object%5D&b=1&b=2&b=3"
  11. //"a=[object+Object]&b=1&b=2&b=3"

可以看出第二个参数类似于控制深度。

源码

  1. // Serialize an array of form elements or a set of
  2. // key/values into a query string
  3. jQuery.param = function( a, traditional ) {
  4. var prefix,// 循环的键命名 for(var k in) 这里即k
  5. s = [],//返回的数据
  6. add = function( key, value ) {
  7. //key value对应循环中每项的name和值如:<input name="" value=""、{key:value}
  8. // 如果value是function,那么计算出返回值
  9. value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
  10. //转为key1=value&key2=value2的形式
  11. s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
  12. };
  13.  
  14. // Set traditional to true for jQuery <= 1.3.2 behavior.
  15. // 设置第二个参数,如果第二个参数等于undefined,取jQuery.ajaxSettings.traditional
  16. if ( traditional === undefined ) {
  17. traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
  18. }
  19.  
  20. // If an array was passed in, assume that it is an array of form elements.
  21. // 第一个参数为数组或者表单的elements
  22. // 为数组或者jquery表单对象,不存在第二个参数的问题(a[]=1;a[]=2)
  23. if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
  24. // Serialize the form elements
  25. // 循环取name与value
  26. jQuery.each( a, function() {
  27. add( this.name, this.value );
  28. });
  29.  
  30. } else {
  31. // If traditional, encode the "old" way (the way 1.3.2 or older
  32. // did it), otherwise encode params recursively.
  33. // 为对象的时候,需要照顾第二个参数,即深度
  34. for ( prefix in a ) {
  35. //调用另外一个方法,传入key,obj[k],深度,add回调方法
  36. buildParams( prefix, a[ prefix ], traditional, add );
  37. }
  38. }
  39.  
  40. // Return the resulting serialization
  41. return s.join( "&" ).replace( r20, "+" );
  42. };
  43.  
  44. var r20 = /%20/g,
  45. rbracket = /\[\]$/,
  46. rCRLF = /\r?\n/g,
  47. rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
  48. rsubmittable = /^(?:input|select|textarea|keygen)/i;
  49.  
  50. function buildParams( prefix, obj, traditional, add ) {
  51. var name;
  52.  
  53. if ( jQuery.isArray( obj ) ) {
  54. // Serialize array item.
  55. // 数组分支
  56. jQuery.each( obj, function( i, v ) {
  57. // 如果第二个参数为真,则直接调用自身会生成类似 a=object 这样的数组
  58. // 或者参数为“数组” key[0]或者key[name]
  59. if ( traditional || rbracket.test( prefix ) ) {
  60. // Treat each array item as a scalar.
  61. // 处理
  62. add( prefix, v );
  63.  
  64. } else {
  65. // Item is non-scalar (array or object), encode its numeric index.
  66. //反之参数key设置为 key[i] 循环调用自身,这时候循环中的自身会进入下一步
  67. buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
  68. }
  69. });
  70.  
  71. } else if ( !traditional && jQuery.type( obj ) === "object" ) {
  72. //如果参数不为真,调用自身,进入第一步
  73. // Serialize object item.
  74. for ( name in obj ) {
  75. buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
  76. }
  77.  
  78. } else {
  79. // Serialize scalar item.
  80. // 每项的操作
  81. add( prefix, obj );
  82. }
  83. }

.serializeArray()

这个是挂载在jQuery.fn方法上的,将当前jQuery form对象转为数组对象,实例

  1. var r20 = /%20/g,
  2. rbracket = /\[\]$/,
  3. rCRLF = /\r?\n/g,
  4. rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
  5. rsubmittable = /^(?:input|select|textarea|keygen)/i;
  6. serializeArray: function() {
  7. //jQuery.fn.map
  8. return this.map(function() {
  9. // Can add propHook for "elements" to filter or add form elements
  10. // 如果当前对象具有elements的prop,则使用,反之使用自身
  11. // elements是原生js中表单所有的input。 如:document.forms[0].elements
  12. var elements = jQuery.prop( this, "elements" );
  13. return elements ? jQuery.makeArray( elements ) : this;
  14. })
  15. .filter(function() {//jQuery.fn.filter
  16. var type = this.type;
  17. // Use .is(":disabled") so that fieldset[disabled] works
  18. // 过滤掉没有name、disabled的、可以提交的几个标签,如过是可选中的元素,则checked为真
  19. return this.name && !jQuery( this ).is( ":disabled" ) &&
  20. rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
  21. ( this.checked || !rcheckableType.test( type ) );
  22. })
  23. .map(function( i, elem ) {////jQuery.fn.map
  24. var val = jQuery( this ).val();
  25. //设置value
  26. return val == null ?
  27. null :
  28. jQuery.isArray( val ) ?
  29. jQuery.map( val, function( val ) {
  30. return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  31. }) :
  32. { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  33. }).get();//转为真正的数组
  34. }

其中使用的get方法就很简单了

  1. get: function( num ) {
  2. return num != null ?
  3.  
  4. // Return a 'clean' array
  5. ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
  6.  
  7. // Return just the object
  8. slice.call( this );
  9. }
  10. //我们也可以使用自己的get方法。如:
  11. // Array.prototype.slice.call($('div'),0,1)//取到第一个div dom元素,相当于$('div').get(0)
  12. // Array.prototype.slice.call($('div'))//取到所有,相当于$('div').get()

至于jQuery.prop方法,需要新起一篇文章介绍了。简单的说,就是获取元素的prop。  element.checked、element.value,是从attr中分离出来的

.serialize

serialize就简单了,相当于serializeArray + parmp,将表单直接转为url查询字符串。代码也简单。同样是在jQuery的fn上

  1. serialize: function() {
  2. return jQuery.param( this.serializeArray() );
  3. },

jquery的serializeArray、param 与serializeArray 的区别与源码解析的更多相关文章

  1. jQuery数据缓存$.data 的使用以及源码解析

    一.实现原理: 对于DOM元素,通过分配一个唯一的关联id把DOM元素和该DOM元素的数据缓存对象关联起来,关联id被附加到以jQuery.expando的值命名的属性上,数据存储在全局缓存对象jQu ...

  2. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  3. jquery源码解析:proxy,access,swap,isArraylike详解

    jQuery的工具方法,其实就是静态方法,源码里面就是通过extend方法,把这些工具方法添加给jQuery构造函数的. jQuery.extend({ ...... guid: 1, //唯一标识符 ...

  4. jQuery整体架构源码解析(转载)

    jQuery整体架构源码解析 最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性, ...

  5. JQuery源码解析(一)

    写在前面:本<JQuery源码解析>系列是基于一些前辈们的文章进行进一步的分析.细化.修改而写出来的,在这边感谢那些慷慨提供科普文档的技术大拿们. 要查阅JQ的源文件请下载开发版的JQ.j ...

  6. jQuery整体架构源码解析

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  7. 解析jQuery中extend方法--源码解析以及递归的过程《二》

    源码解析 在解析代码之前,首先要了解extend函数要解决什么问题,以及传入不同的参数,会达到怎样的效果.extend函数内部处理传入的不同参数,返回处理后的对象. extend函数用来扩展对象,增加 ...

  8. jQuery源码解析资源便签

    最近开始解读jQuery源码,下面的链接都是搜过来的,当然妙味课堂 有相关的一系列视频,长达100多期,就像一只蜗牛慢慢爬, 至少品读三个框架,以后可以打打怪,自己造造轮子. 完全理解jQuery源代 ...

  9. jQuery源码解析对象实例化与jQuery原型及整体构建模型分析(一)

    //源码剖析都基于jQuery-2.0.3版本,主要考虑到兼容IE 一.关于jQuery对象实例化的逻辑: 整个jQuery程序被包裹在一个匿名自执行行数内: (function(window,und ...

随机推荐

  1. 软件RAID

    软件RAID也必须在多磁盘系统中才能实现.实现RAID1最少要拥有两块硬盘,而实现RAID5则最少要拥有三块硬盘.通常情况下,操作系统所在磁盘采用RAID1,而数据所在磁盘采用RAID5.   卷的类 ...

  2. DevOps on AWS之OpsWorks初体验

    AWS OpsWorks 是一款配置管理服务,提供 Chef 和 Puppet 的托管EC2虚拟机实例.Chef 和 Puppet 是自动化平台,允许用户使用代码来自动配置服务器.用户借助OpsWor ...

  3. 学习笔记 | treap | splay

    目录 前言 treap 它的基本操作 前言 不会数据结构选手深深地感受到了来自treap的恶意QwQ 在听的时候感觉自己听得听懂的??大概只是听懂了它的意思 代码是怎么写都感觉写不好╮(╯﹏╰)╭ 菜 ...

  4. XAMPP安装PHP_GMP

    CentOS 6.4 Xampp 7.1.12 下载PHP7.1.12的源码包 yum install gmp-devel yum install m4 .tar.xz cd /root/php-/e ...

  5. Mongodb For Mac OSX && 登录验证

    题外话:尽管有不少人贴出了 <我不用mongodb的十大理由> 等系列文章,但是 NoSQL 的发展不会因此而止步, mongodb 是 NoSQL 的典型代表,楼主还是抱乐观态度的,有人 ...

  6. Thunder——爱阅app(测评人:方铭)

    B.Thunder——爱阅app(测评人:方铭) 一.基于NABCD评论作品,及改进建议 每个小组评论其他小组Alpha发布的作品: 1.根据(不限于)NABCD评论作品的选题: 2.评论作品对选题的 ...

  7. Beta周王者荣耀交流协会第五次Scrum会议

    1. 立会照片 成员王超,高远博,冉华,王磊,王玉玲,任思佳,袁玥全部到齐. master:王磊 2. 时间跨度 2017年11月14日 19:00 — 19:50 ,总计50分钟. 3. 地点 一食 ...

  8. 《Spring1之第十次站立会议》

    <第十次站立会议> 昨天:试着把用C#写的代码转换为java语言. 今天:已基本转换为java语言了,也能够实现视频聊天这个功能了. 遇到的问题:在进行视频通话时没有考虑到声音优化功能,实 ...

  9. boolean类型的按位或||和|的区别

    boolean类型既可以使用&&和||做逻辑运算,也可以使用&和|做逻辑运算,但前者是经过优化的(执行短路运算),后者未优化. 以下代码验证: 逻辑或|| public cla ...

  10. Beta阶段——第五篇 Scrum 冲刺博客

    i. 提供当天站立式会议照片一张: ii. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 对宿舍权限的管理 (2) 今天计划完成的工作: 完善权限管理,进行舍员充值分明 ...