上一篇主要温习了一下form表单的属性和表单元素,这一片主要讲解用JavaScript如何操做form。javascript
用JavaScript操做表单,免不了会有取值赋值操做,好比有如下表单:html
<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
的方式html5
alert(form1.action); => '/login' alert(form1.method); => 'post' alert(form1.user_name.value) => ''
而要获取表单中的字段,则经过:java
// 属于本表单元素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
等。例如node
// 把表单提交到 "/signIn" form1.action = '/signIn'; // 修改表单提交方式为 "GET" form1.method = 'GET';
而给表单元素赋值,则是经过 elem.value
的方式,例如jquery
// 将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。经常使用的方式是:git
form1.reset(); $(form1.user_phone).change();
传统的表单校验方式是经过监听的 submit
事件或是表单字段的 input
, focus
, blur
, change
事件,去触发JavaScript中指定的校验规则,来肯定表单是提交仍是拒绝提交。github
步入html5时代以后,能够仅经过html自己完成表单提交前的校验工做。方式是给表单字段加上 required
和 pattern
属性,required
是告诉浏览器这个字段须要校验,而 pattern
则指定一个正则表达式形式的校验规则。在表单提交时,浏览器会自动进行一系列的校验工做,没有经过校验的表单是没法提交到服务器的。
想要手动检查整个表单是否经过了校验规则,能够经过 form.checkValidity()
方法,它会返回一个布尔值。ajax
比较知名的表单校验插件是 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对象 。
许多专门作文件上传的插件,会同时使用两种上传方式,以兼容不一样浏览器。