摘要:在表單提交時(shí),瀏覽器會(huì)自動(dòng)進(jìn)行一系列的校驗(yàn)工作,沒(méi)有通過(guò)校驗(yàn)的表單是無(wú)法提交到服務(wù)器的。而方法提交表單,會(huì)在請(qǐng)求中發(fā)送表單字段鍵值對(duì)。表單提交事件表單提交到服務(wù)器時(shí),會(huì)觸發(fā)事件。
上一篇主要溫習(xí)了一下form表單的屬性和表單元素,這一片主要講解用JavaScript如何操作form。
表單操作 取值用JavaScript操作表單,免不了會(huì)有取值賦值操作,比如有以下表單:
用JavaScript獲取表單的屬性值,或者表單字段的值,可以直接通過(guò) elem.name 的方式
alert(form1.action); => "/login" alert(form1.method); => "post" alert(form1.user_name.value) => ""
而要獲取表單中的字段,則通過(guò):
// 屬于本表單元素nodelist類數(shù)組,如果通過(guò)form屬性指定到其他表單,不會(huì)算作本表單元素,下面獲取到的元素是field 0,field 1,field 2,field 5 console.log(form1.elements); => [...,...,...] // 屬于本表單元素個(gè)數(shù),如果通過(guò)form屬性指定到其他表單,不會(huì)算作本表單元素 console.log(form1.length); => 4 // nodelist中下標(biāo)為2的表單元素 console.log(form1[1]); => // 表單中 name="user_name" 的元素,有同名的字段則返回一個(gè)nodelst類數(shù)組 console.log(form1["user_name"]); => 或 nodelist // 獲取表單全部?jī)?nèi)容,詳情見(jiàn)下面的 “提交” 條目 jQuery("#form1").serialize(); => user_name=&user_email=&user_phone=13333333331 jQuery("#form1").serializeArray(); => [] 一個(gè)數(shù)組,里面是每個(gè)字段的鍵值對(duì) new FormData(form1) => 沒(méi)有返回值賦值
表單本身的屬性可以通過(guò)JavaScript賦值,比如 action , method , target 等。例如
// 把表單提交到 "/signIn" form1.action = "/signIn"; // 修改表單提交方式為 "GET" form1.method = "GET";
而給表單元素賦值,則是通過(guò) elem.value 的方式,例如
// 將user_name的值設(shè)定為 "hello world" form1.user_name.value = "hello world"; // 選中select中值為2的option form1.user_phone.value = 2;重置
可以通過(guò)html或者JavaScript的方式把表單值重置為頁(yè)面初始的樣子。
html方式為點(diǎn)擊 type="reset" 的 input 或 button。JavaScript的方式為 form1.reset() 。
如果表單中應(yīng)用了第三方UI庫(kù)如 select2 ,重置后還需要手動(dòng)觸發(fā)表單元素的change事件,以觸發(fā)第三方庫(kù)更新UI。常用的方式是:
form1.reset(); $(form1.user_phone).change();校驗(yàn) 傳統(tǒng)校驗(yàn)
傳統(tǒng)的表單校驗(yàn)方式是通過(guò)監(jiān)聽(tīng)的 submit 事件或是表單字段的 input , focus , blur , change 事件,去觸發(fā)JavaScript中指定的校驗(yàn)規(guī)則,來(lái)確定表單是提交還是拒絕提交。
html5校驗(yàn)步入html5時(shí)代之后,可以僅通過(guò)html本身完成表單提交前的校驗(yàn)工作。方式是給表單字段加上 required 和 pattern 屬性,required 是告訴瀏覽器這個(gè)字段需要校驗(yàn),而 pattern 則指定一個(gè)正則表達(dá)式形式的校驗(yàn)規(guī)則。在表單提交時(shí),瀏覽器會(huì)自動(dòng)進(jìn)行一系列的校驗(yàn)工作,沒(méi)有通過(guò)校驗(yàn)的表單是無(wú)法提交到服務(wù)器的。
想要手動(dòng)檢查整個(gè)表單是否通過(guò)了校驗(yàn)規(guī)則,可以通過(guò) form.checkValidity() 方法,它會(huì)返回一個(gè)布爾值。
提交 提交規(guī)則比較知名的表單校驗(yàn)插件是 jquery-validation 。
提交表單時(shí),表單擁有的字段會(huì)按照method中的指定方式提交給服務(wù)器,而表單提交的字段規(guī)則是:
表單元素 | type |
規(guī)則 |
---|---|---|
button |
永遠(yuǎn)不提交 |
|
checkbox | 只在勾選后提交 | |
file | 永遠(yuǎn)提交,即使為空值 | |
hidden | 永遠(yuǎn)提交,即使為空值 | |
image | 永遠(yuǎn)提交,即使為空值 | |
password | 永遠(yuǎn)提交,即使為空值 | |
radio | 只在勾選后提交,如果一組Radio沒(méi)有任何勾選,全部不提交。 | |
reset | 永遠(yuǎn)不提交 |
|
submit | 點(diǎn)擊哪個(gè)按鈕,則提交這個(gè)按鈕的值,其他的SUBMIT按鈕值都不提交。 如果表單的提交行為是由JavaScript腳本觸發(fā)的,則不提交任何值。 |
|
text | 永遠(yuǎn)提交,即使為空值 | |
button |
永遠(yuǎn)不提交 |
|
reset | 永遠(yuǎn)不提交 | |
submit | 點(diǎn)擊哪個(gè)按鈕提交表單,則提交這個(gè)按鈕的值。 如果省略TYPE,IE默認(rèn)為BUTTON,火狐默認(rèn)SUBMIT。 |
|
- |
永遠(yuǎn)提交,即使為空值。 | |
- | 永遠(yuǎn)提交,即使為空值。 |
表格中沒(méi)有提到的規(guī)則還有:
具有disabled屬性的字段不會(huì)被提交
不具有name屬性的字段不會(huì)被提交
同名的name屬性會(huì)發(fā)生覆蓋,radio和checkbox除外
form指向其他表單的字段,不會(huì)被本表單提交
表單序列化規(guī)則來(lái)源 http://www.cnblogs.com/manors/archive/2010/03/11/1683727.html
GET方法提交表單,表單字段會(huì)被encodeURIComponent轉(zhuǎn)換,并在url中顯示出來(lái)。而post方法提交表單,會(huì)在請(qǐng)求body中發(fā)送表單字段鍵值對(duì)。
在通過(guò)JavaScript異步提交表單時(shí),如何按照上面的規(guī)則去獲取表單數(shù)據(jù),jquery提供了 serialize() 和 serializeArray() 兩個(gè)方法。使用該方法會(huì)取得和原生表單一致的提交字段。
表單提交事件表單提交到服務(wù)器時(shí),會(huì)觸發(fā) submit 事件。也可以通過(guò) form.submit() 手動(dòng)提交一個(gè)表單。
form1.onsubmit = function(event){ event.preventDefault(); // 阻止默認(rèn)事件,表單將不會(huì)提交到服務(wù)器 if(confirm("你真的要提交我嗎~")){ this.submit(); // 點(diǎn)擊確定后,表單會(huì)被提交 } }技巧 不提交空字段
通過(guò)上方的表單提交規(guī)則可以知道,很多時(shí)候,無(wú)論是否填寫(xiě)了值,在提交的時(shí)候,該字段都會(huì)被提交到服務(wù)器。而在執(zhí)行條件篩選表單提交的時(shí)候,由于常用的是GET請(qǐng)求,瀏覽器地址欄中通常會(huì)出現(xiàn)一長(zhǎng)串字符。
這對(duì)于有潔癖的用戶來(lái)說(shuō)是無(wú)法忍受的,所以需要在提交表單前做一點(diǎn)小動(dòng)作,讓值為空的字段不提交到服務(wù)器。
// 本段代碼使用了jquery var form = $("form"), fields = form.find(":input"); form.on("submit",function(event){ event.preventDefault(); // 阻止默認(rèn)事件,表單將不會(huì)提交到服務(wù)器 fields.each(function(){ if(!this.value.length) this.disabled = "disabled"; // 含有disabled屬性的表單字段將不會(huì)被提交 }); this.submit(); })異步提交文件
一般而言,文件提交都是同步的,因?yàn)橐话愕谋韱涡蛄谢椒ǎ瑹o(wú)法傳輸二進(jìn)制的文件。而如果要實(shí)現(xiàn)異步上傳文件的需求,主要依靠?jī)煞N方式。
一種是新建一個(gè) iframe ,在里面通過(guò)一個(gè)獨(dú)立的form表單上傳文件后,再和主frame進(jìn)行通信。另一種則是通過(guò)html5的 new FormData() 方法,append進(jìn)去一個(gè)文件,或是直接讀取表單信息。
利用 iframe 方式提交文件的較為知名的插件是 jquery.form.js 。通過(guò) new FormData() 則簡(jiǎn)單了許多:
# 這是一個(gè)來(lái)自 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不要去處理發(fā)送的數(shù)據(jù) contentType: false // 告訴jQuery不要去設(shè)置Content-Type請(qǐng)求頭 });
更多用法請(qǐng)參考 MDN--使用FormData對(duì)象 。
許多專門做文件上傳的插件,會(huì)同時(shí)使用兩種上傳方式,以兼容不同瀏覽器。
參考資料MDN
w3.org
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/49889.html
摘要:用于或元素時(shí),將提交指定的表單示例代碼只能上傳圖片只能上傳視頻使用的屬性,是一個(gè)類型的值,或文件后綴名。在以前,要想改變表單元素外觀,需要通過(guò)其他標(biāo)簽來(lái)模擬。以下點(diǎn)到名的表單元素,還是可以照常使用的。 做為html中最為常見(jiàn),應(yīng)用最廣泛的標(biāo)簽之一,form常伴隨前端左右。了解更深,用的更順。 表單屬性 這個(gè)表單展示了form表單常用的屬性 屬性名 屬性值 ...
摘要:如果看視頻能夠成為高手,那每一個(gè)球迷都應(yīng)該是梅西。克服心理障礙前端的飛速發(fā)展,不僅僅是初學(xué)者,哪怕熟手都會(huì)焦慮感覺(jué)很多東西都不會(huì)。 很多前端都想找一個(gè)學(xué)習(xí)計(jì)劃,然后認(rèn)真學(xué),成為一個(gè)大牛;他們迫切的想知道自己該學(xué)什么,然后看什么書(shū),有什么資源可以用! 我今天要告訴你的是,你不要看什么書(shū),不要做什么事!因?yàn)槿绻阍俨磺‘?dāng)?shù)碾A段,看了那些看起來(lái)很正確的金科玉律一般的書(shū)籍,除了打消你學(xué)習(xí)的興趣...
閱讀 2477·2021-09-29 09:34
閱讀 3313·2021-09-23 11:21
閱讀 2504·2021-09-06 15:00
閱讀 1132·2019-08-30 15:44
閱讀 2031·2019-08-29 17:23
閱讀 3004·2019-08-29 16:44
閱讀 3061·2019-08-29 13:13
閱讀 1940·2019-08-28 18:12