form表单那点事儿(下) 进阶篇
form表单那点事儿(下) 进阶篇
上一篇主要温习了一下form表单的属性和表单元素,这一片主要讲解用JavaScript如何操作form。
目录:
表单操作
技巧
表单操作
取值
用JavaScript操作表单,免不了会有取值赋值操作,比如有以下表单:
<form id='form0'></form>
<form action="/login" method="post" target="blank" id='form1'>
<input type="text" name='user_name'> <!--field 0-->
<input type="email" name='user_email'> <!--field 1-->
<select name='user_phone'> <!--field 2-->
<option value='1'>13333333331</option>
<option value='2'>13333333332</option>
<option value='3'>13333333333</option>
</select>
<input type="text" name='form0_user_phone' form='form0'> <!--field 3-->
<button type='submit' form='form0'>预览</button> <!--field 4-->
<button type='submit'>提交</button> <!--field 5-->
</form>
用JavaScript获取表单的属性值,或者表单字段的值,可以直接通过 elem.name
的方式
alert(form1.action); => '/login'
alert(form1.method); => 'post'
alert(form1.user_name.value) => ''
而要获取表单中的字段,则通过:
// 属于本表单元素nodelist类数组,如果通过form属性指定到其他表单,不会算作本表单元素,下面获取到的元素是field 0,field 1,field 2,field 5
console.log(form1.elements); => [<input>...,...,...</button>]
// 属于本表单元素个数,如果通过form属性指定到其他表单,不会算作本表单元素
console.log(form1.length); => 4
// nodelist中下标为2的表单元素
console.log(form1[1]); => <input type="email" name='user_email'>
// 表单中 name='user_name' 的元素,有同名的字段则返回一个nodelst类数组
console.log(form1['user_name']); => <input type="text" name='user_name'> 或 nodelist
// 获取表单全部内容,详情见下面的 “提交” 条目
jQuery('#form1').serialize(); => user_name=&user_email=&user_phone=13333333331
jQuery('#form1').serializeArray(); => [] 一个数组,里面是每个字段的键值对
new FormData(form1) => 没有返回值
赋值
表单本身的属性可以通过JavaScript赋值,比如 action
, method
, target
等。例如
// 把表单提交到 "/signIn"
form1.action = '/signIn';
// 修改表单提交方式为 "GET"
form1.method = 'GET';
而给表单元素赋值,则是通过 elem.value
的方式,例如
// 将user_name的值设定为 "hello world"
form1.user_name.value = "hello world";
// 选中select中值为2的option
form1.user_phone.value = 2;
重置
可以通过html或者JavaScript的方式把表单值重置为页面初始的样子。
html方式为点击 type='reset'
的 input
或 button
。
JavaScript的方式为 form1.reset()
。
如果表单中应用了第三方UI库如 select2
,重置后还需要手动触发表单元素的change事件,以触发第三方库更新UI。
常用的方式是:
form1.reset();
$(form1.user_phone).change();
校验
传统校验
传统的表单校验方式是通过监听的 submit
事件或是表单字段的 input
, focus
, blur
, change
事件,去触发JavaScript中指定的校验规则,来确定表单是提交还是拒绝提交。
html5校验
步入html5时代之后,可以仅通过html本身完成表单提交前的校验工作。方式是给表单字段加上 required
和 pattern
属性,
required
是告诉浏览器这个字段需要校验,而 pattern
则指定一个正则表达式形式的校验规则。在表单提交时,浏览器会自动进行一系列的校验工作,没有通过校验的表单是无法提交到服务器的。
在表单提交之前,可以通过 form.checkValidity()
方法,这个方法会返回一个布尔值回馈整个表单是否通过了校验规则。
比较知名的表单校验插件是 jquery-validation 。
提交
提交规则
提交表单时,表单拥有的字段会按照method中的指定方式提交给服务器,而表单提交的字段规则是
表单元素 | type |
规则 |
---|---|---|
<input> |
button |
永远不提交 |
<input> | checkbox | 只在勾选后提交 |
<input> | file | 永远提交,即使为空值 |
<input> | hidden | 永远提交,即使为空值 |
<input> | image | 永远提交,即使为空值 |
<input> | password | 永远提交,即使为空值 |
<input> | radio | 只在勾选后提交,如果一组Radio没有任何勾选,全部不提交。 |
<input> | reset | 永远不提交 |
<input> | submit | 点击哪个按钮,则提交这个按钮的值,其他的SUBMIT按钮值都不提交。 如果表单的提交行为是由JavaScript脚本触发的,则不提交任何值。 |
<input> | text | 永远提交,即使为空值 |
<button> |
button |
永远不提交 |
<button> | reset | 永远不提交 |
<button> | submit | 点击哪个按钮提交表单,则提交这个按钮的值。 如果省略TYPE,IE默认为BUTTON,火狐默认SUBMIT。 |
<select> |
- |
永远提交,即使为空值。 |
<textarea> |
- | 永远提交,即使为空值。 |
表格中没有提到的规则还有:
- 具有disabled属性的字段不会被提交
- 不具有name属性的字段不会被提交
- 同名的name属性会发生覆盖,radio和checkbox除外
- form指向其他表单的字段,不会被本表单提交
规则来源 http://www.cnblogs.com/manors/archive/2010/03/11/1683727.html
表单序列化
GET方法提交表单,表单字段会被encodeURIComponent转换,并在url中显示出来。而post方法提交表单,会在请求body中发送表单字段键值对。
在通过JavaScript异步提交表单时,如何按照上面的规则去获取表单数据,jquery提供了 serialize()
和 serializeArray()
两个方法。使用该方法会取得和原生表单一致的提交字段。
表单提交事件
表单提交到服务器时,会触发 submit
事件。也可以通过 form.submit()
手动提交一个表单。
form1.onsubmit = function(event){
event.preventDefault(); // 阻止默认事件,表单将不会提交到服务器
if(confirm('你真的要提交我吗~')){
this.submit(); // 点击确定后,表单会被提交
}
}
技巧
不提交空字段
通过上方的表单提交规则可以知道,很多时候,无论是否填写了值,在提交的时候,该字段都会被提交到服务器。而在执行条件筛选表单提交的时候,由于常用的是GET请求,浏览器地址栏中通常会出现一长串字符。
这对于有洁癖的用户来说是无法忍受的,所以需要在提交表单前做一点小动作,让值为空的字段不提交到服务器。
// 本段代码使用了jquery
var form = $('form'),
fields = form.find(':input');
form.on('submit',function(event){
event.preventDefault(); // 阻止默认事件,表单将不会提交到服务器
fields.each(function(){
if(!this.value.length) this.disabled = 'disabled'; // 含有disabled属性的表单字段将不会被提交
});
this.submit();
})
异步提交文件
一般而言,文件提交都是同步的,因为一般的表单序列化方法,无法传输二进制的文件。而如果要实现异步上传文件的需求,主要依靠两种方式。
一种是新建一个 iframe
,在里面通过一个独立的form表单上传文件后,再和主frame进行通信。另一种则是通过html5的 new FormData()
方法,append进去一个文件,或是直接读取表单信息。
利用 iframe
方式提交文件的较为知名的插件是 jquery.form.js 。通过 new FormData()
则简单了许多:
# 这是一个来自 MDN 的示例
// 原生JavaScript方式
var xhr = new XMLHttpRequest();
xhr.open("POST", form1.action);
xhr.send(new FormData(form1));
// 使用jquery的ajax()
$.ajax({
url: form1.action,
type: "POST",
data: new FormData(form1),
processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false // 告诉jQuery不要去设置Content-Type请求头
});
更多用法请参考 MDN--使用FormData对象 。
参考资料
form表单那点事儿(下) 进阶篇的更多相关文章
- form表单那点事儿(上) 基础篇
form表单那点事儿(上) 基础篇 做为html中最为常见,应用最广泛的标签之一,form常伴随前端左右.了解更深,用的更顺. 目录: 表单属性 表单元素 常识 模拟外观 表单属性 这个表单展示了fo ...
- Django框架form表单的那些事儿
Form那些事儿 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; 1:initial 初始值,input框里面的初始值. class L ...
- form表单上传图片问题:线下可以而线上不可以
由于上传图片需要一定时间,而线下速度快线上速度慢. 所以如果你的上传窗口是弹出界面,那么就会面临上传未完成就关闭了该界面.导致上传失败.
- Form表单元素
Form表单元素 action method input: name value type: text password button radio checkbox file submit reset ...
- 解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...
- 按下回车默认提交form表单问题
最近开发中碰到一个问题,项目中有几个列表展示页面,允许用户通过查询条件模糊查询数据.用户录入关键字后点击回车会调用查询方法根据关键字查询,原先功能没有问题,但是最近发现在查询输入框中按下回车会直接刷新 ...
- form表单下的button按钮会自动提交表单的问题
form表单下的button按钮会自动提交表单的问题 2017年01月05日 18:02:44 蓝色水 阅读数:18012更多 个人分类: asp.net form表单下的按钮在没有指定type类 ...
- html-4, form 表单 输入、传文件、单选、多选、下拉菜单、文本描述、重置、submit、按钮限制输入
<!-- form HTTP协议 action:提交的服务器网址 method:get(默认)| post(应用:登录注册.上传文件) 页面中的a img link 默认是get请求 input ...
- jquery下的提交,点击按钮没反应,post方法不执行 JSON方式在FORM表单下不起作用
jquery下的提交,点击按钮没反应,post方法不执行 JSON方式在FORM表单下不起作用
随机推荐
- Linux第三次学习笔记
#信息的表示和处理 三种重要的数字表示 1. 无符号数编码: 基于传统的二进制表示法,表示大于或者等于零的数字. 2. 补码编码: 表示有符号数整数的最常见的方式,有符号数就是只可 以为正或者为负的数 ...
- Linux命令学习
Linux命令学习 Ubuntu常用快捷键 •Ctrl+Alt+T: 打开终端 •Ctrl+Shift+T: 新建标签页 •Tab: 终端中命令补全 •Alt+数字N: 终端中切换到第N个标签页 •↑ ...
- Opencv step by step - ROI
什么是ROI?ROI就是region of interest ,就是你感兴趣的图像部分,在图像处理中,可能同时要处理多个ROI. Opencv有ROI的API,但是只能同时处理一个(书本上说的,未验证 ...
- jQuery问题:$XXX is not a function
用火狐浏览器打开,js代码一段不执行,F12以后看见下面的错误: 网上查看说是jQuery文件引用的问题,把jQuery.js引入语句修改了一下,果然没有错了. 我原来的引用语句是:<scrip ...
- 第四十课:CSS3 transition详解
W3C中对transition是这样描述的:允许css的属性值在一定的时间内平滑的过渡,也就是说,以动画的效果改变css的属性值. transition主要包含4个属性值:transition-pro ...
- mysqldump使用方法
1.mysqldump的几种常用方法: (1)导出整个数据库(包括数据库中的数据) mysqldump -u username -p dbname > dbname.sql (2)导出数据库结构 ...
- Future模式
Future模式简介 Future模式有点类似于网上购物,在你购买商品,订单生效之后,你可以去做自己的事情,等待商家通过快递给你送货上门.Future模式就是,当某一程序提交请求,期望得到一个答复.但 ...
- 传智168期JavaEE就业班 day03-js
* 课程回顾: * CSS * CSS的简介 * 层叠样式表. * CSS与HTML的结合(4种) * HTML的标签提供了属性 style="CSS的代码" * HTML提供了标 ...
- poj1470 LCA Tarjan
比较直接的题目,入门一下. #include<map> #include<queue> #include<stack> #include<cmath> ...
- Java虚拟机的功能
1:通过ClassLoader寻找和装载class文件 2:解释字节码成为指令并执行,提供class文件的运行环境.即将字节码转换为不同OS下可执行的机器码指令. 3:进行垃圾回收. 4:提供与硬件交 ...