jQuery.param( obj, traditional )

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

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

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

源码

// Serialize an array of form elements or a set of
// key/values into a query string
jQuery.param = function( a, traditional ) {
var prefix,// 循环的键命名 for(var k in) 这里即k
s = [],//返回的数据
add = function( key, value ) {
//key value对应循环中每项的name和值如:<input name="" value=""、{key:value}
// 如果value是function,那么计算出返回值
value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
//转为key1=value&key2=value2的形式
s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
}; // Set traditional to true for jQuery <= 1.3.2 behavior.
// 设置第二个参数,如果第二个参数等于undefined,取jQuery.ajaxSettings.traditional
if ( traditional === undefined ) {
traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
} // If an array was passed in, assume that it is an array of form elements.
// 第一个参数为数组或者表单的elements
// 为数组或者jquery表单对象,不存在第二个参数的问题(a[]=1;a[]=2)
if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
// Serialize the form elements
// 循环取name与value
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 ) {
//调用另外一个方法,传入key,obj[k],深度,add回调方法
buildParams( prefix, a[ prefix ], traditional, add );
}
} // Return the resulting serialization
return s.join( "&" ).replace( r20, "+" );
}; var r20 = /%20/g,
rbracket = /\[\]$/,
rCRLF = /\r?\n/g,
rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
rsubmittable = /^(?:input|select|textarea|keygen)/i; function buildParams( prefix, obj, traditional, add ) {
var name; if ( jQuery.isArray( obj ) ) {
// Serialize array item.
// 数组分支
jQuery.each( obj, function( i, v ) {
// 如果第二个参数为真,则直接调用自身会生成类似 a=object 这样的数组
// 或者参数为“数组” key[0]或者key[name]
if ( traditional || rbracket.test( prefix ) ) {
// Treat each array item as a scalar.
// 处理
add( prefix, v ); } else {
// Item is non-scalar (array or object), encode its numeric index.
//反之参数key设置为 key[i] 循环调用自身,这时候循环中的自身会进入下一步
buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
}
}); } else if ( !traditional && jQuery.type( obj ) === "object" ) {
//如果参数不为真,调用自身,进入第一步
// Serialize object item.
for ( name in obj ) {
buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
} } else {
// Serialize scalar item.
// 每项的操作
add( prefix, obj );
}
}

.serializeArray()

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

var r20 = /%20/g,
rbracket = /\[\]$/,
rCRLF = /\r?\n/g,
rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
rsubmittable = /^(?:input|select|textarea|keygen)/i;
serializeArray: function() {
//jQuery.fn.map
return this.map(function() {
// Can add propHook for "elements" to filter or add form elements
// 如果当前对象具有elements的prop,则使用,反之使用自身
// elements是原生js中表单所有的input。 如:document.forms[0].elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
})
.filter(function() {//jQuery.fn.filter
var type = this.type;
// Use .is(":disabled") so that fieldset[disabled] works
// 过滤掉没有name、disabled的、可以提交的几个标签,如过是可选中的元素,则checked为真
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
})
.map(function( i, elem ) {////jQuery.fn.map
var val = jQuery( this ).val();
//设置value
return val == null ?
null :
jQuery.isArray( val ) ?
jQuery.map( val, function( val ) {
return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
}) :
{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
}).get();//转为真正的数组
}

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

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

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

.serialize

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

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

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. CS224n-作业1

    0 前言 作业1对应的试题 作业1对应的启动代码 作业1主页 1 Softmax(10分) (a)(5分) 对于向量$x+c$的任一维度$i$,有: \begin{align*}\mbox{softm ...

  2. fdisk命令详解

    基础命令学习目录 原文链接:https://www.cnblogs.com/xiaofengkang/archive/2011/06/06/2073579.html fdisk -l 可以列出所有的分 ...

  3. 在虚拟机下安装Ubuntu

    目录: 1.安装虚拟机 2.在虚拟下安装Ubuntu 本文将按照目录分两步来讲一下在虚拟机下安装Ubuntu.第一步是安装虚拟机,第二步是在虚拟机下安装Ubuntu. 安装虚拟机 下载虚拟机链接以及激 ...

  4. android学习-1

    所有的android应用都是由屏幕构成的一个集合,每个屏幕则由一个活动和一个布局组成. 活动--用户可以完成的一个确定的事. 布局--对屏幕外观的描述.(布局写为一个XML文件,回告诉android如 ...

  5. 2018-2019-20172321 《Java软件结构与数据结构》第八周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第八周学习总结 教材学习内容总结 第12章 优先队列与堆 一.概述 堆 堆的前提就是他首先是一个完全二叉树,其次就是满足 ...

  6. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算 第二周

    一.结对对象 姓名:侯泽洋 学号:20172308 担任角色:驾驶员(侯泽洋) 伙伴第二周博客地址 二.本周内容 (一)继续编写上周未完成代码 1.本周继续编写代码,使代码支持分数类计算 2.相关过程 ...

  7. WebService有什么用?

    入门之前先简单介绍下WCF.在用WebService做开发时,很多人都不知道WCF和WebService之间的关系.实际上WCF包含了WebService,这是一个很强悍的通信技术应用框架.微软把.N ...

  8. 【CSAPP笔记】14. 异常控制流和进程

    从给处理器加电,到断电为止,处理器做的工作其实就是不断地读取并执行一条条指令.这些指令的序列就叫做 CPU 的控制流(control flow).最简单的控制流是"平滑的",也就是 ...

  9. json 数组

    /** * 获取 选中的id * @returns {*} */function getCheckedList(){ var groups =[]; $("input[name='check ...

  10. 微信小程序组件 自定义多选

    <view class='back'></view> <view class="container"> <!-- 睡眠记录 --> ...