前言
JavaScript最初的一个应用场景就是分担服务器处理表单的责任,打破处处依赖服务器的局面,这篇文章主要介绍zepto中
form
模块关于表单处理的几个方法,serialize
、serializeArray
、submit
。
表单相关回顾
在开始学些form模块相关方法前,我们先来回顾一下表单提交时,浏览器是怎么样将数据发送给服务器的(以下内容摘自《JavaScript高级程序设计》第14章 14.4节 表单序列化)
- 对表单字段的名称和值进行URL编码,使用&分隔。
- 不发送禁用的表单字段。(也就是属性disabled为true的)
- 只发送勾选的复选框和单选按钮
- 不发送type为reset和button的按钮
- 多选选择框中每个选择的值单独一个条目
- 在单击提交按钮表单的情况下,也会发送提交按钮的value值,否则不发送提交按钮。
- select元素的值,就是选中的option元素的value属性的值,如果option元素没有value属性,则是option元素的文本值。 在表单序列化得过程中,一般不包含任何按钮字段,因为结果字符串很可能是通过其他方式提交的,除此之外其他规则都应该遵循。
有了上面的知识的回顾,接下来我们开始看zepto中serialize
和serializeArray
的实现
serializeArray
因为serialize依赖serializeArray的实现,所以我们先来看看它是怎么实现的。而他的作用是把form表单序列化成一个由 name 和 value 属性组成的对象的数组。形如:
|
|
源代码
|
|
在$的原型上添加了serializeArray
相关方法。一开始声明了name
,type
, result
三个变量,分别存储表单控件的name属性,type属性,以及最后函数执行完成后要返回的数组。
首先通过this[0]
判断有未选中表单元素,如果没有返回的结果就是一个空数组了。如果选中了,则对该表单的相关控件(form.elements
表示表单中所有控件的集合)进行遍历。
获取单个控件的类型(type),name属性(name),再接着就是判断符合提交到服务器端的表单控件条件了。
- 需要有name属性(条件为”真”)
- 不能是
fieldset
元素 - 不能是已经禁止的元素(即disable为true)
- 不能是submit、reset、button、file等元素
- 对于单选和多选控件,只发送已经勾选的。
在上面的条件都满足的条件下,调用add
函数并将通过$(elements).val()获取到的值传入。
add函数的逻辑也非常简单。如果value是数组,则将value数组递归的每一项传入add。不是数组就是直接按照{ name: name, value: value }
形式推入result了。
不过什么时候value会为数组呢?我们需要从zepto模块的val函数实现看起
val函数实现
|
|
serialize
将表单内容序列化为查询字符串。类似
name=qianlongo&sex=boy
源代码
|
|
有了serializeArray
的基础,serialize
就是将相应的name和value都通过encodeURIComponent
编码,然后用&
符号进行分割,也就达到了我们要的结果。
submit
有两种用法,当传入了一个回调函数的时候,是给指定的表单的
submit
事件添加一个回调处理函数。如果没有传入回调函数则触发当前表单
submit
事件,并且执行默认的提交表单行为(前提是没有阻止浏览器默认行为)
源代码
|
|
结尾
以上是zepto form模块的相关源码分析,欢迎大家指正。
文章记录
form模块
zepto模块
event模块
ajax模块