一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

DOM編程藝術(shù)(表單操作)

 阿白mvo3hep7cv 2020-03-21

1、表單元素

一、編寫表單的步驟:

1、構(gòu)建表單----------------》2、服務(wù)器處理(主要是提供負(fù)責(zé)接收數(shù)據(jù)的接口,用來處理數(shù)據(jù)的存儲等信息)------------》3、配置表單

示例:

披薩預(yù)定表單:

  1. <form action=''>
  2. <p><label>姓名:<input></label></p><!--用label標(biāo)簽來做元素的關(guān)聯(lián)-->
  3. <p><label>電話:<input type='tel'></label></p>
  4. <p><label>郵箱:<input type='email'></label></p>
  5. <fieldset>
  6. <legend> 披薩大小 </legend>
  7. <label><input type='radio' name='size'></label>
  8. <label><input type='radio' name='size'></label>
  9. <label><input type='radio' name='size'></label>
  10. </fieldset>
  11. <fieldset>
  12. <legend> 披薩配料 </legend>
  13. <label><input type='checkbox'> 熏肉 </label>
  14. <label><input type='checkbox'> 奶酪 </label>
  15. <label><input type='checkbox'> 洋蔥 </label>
  16. <label><input type='checkbox'> 蘑菇 </label>
  17. </fieldset>
  18. <p><label>配送時間:<input type='time' min='11:00' max='21:00' step='900'></label></p>
  19. <p><button>提交訂單</button></p>
  20. </form>
配置表單:
  1. <form method='post' action='https://pizza./order' enctype='application/x-www-form-urlencoded'>
  2. <!--action屬性配置接收數(shù)據(jù)的地址,enctype指定編碼方式-->
  3. <p><label>姓名:<input name='custname'></label></p>
  4. <p><label>電話:<input type='tel' name='custtel'></label></p>
  5. <p><label>郵箱:<input type='email' name='custemail'></label></p>
  6. <fieldset>
  7. <legend> 披薩大小 </legend>
  8. <label><input type='radio' name='size' value='small'></label>
  9. <label><input type='radio' name='size' value='medium'></label>
  10. <label><input type='radio' name='size' value='large'></label>
  11. </fieldset>
  12. <fieldset>
  13. <legend> 披薩配料 </legend>
  14. <label><input type='checkbox' name='topping' value='bacon'> 熏肉 </label>
  15. <label><input type='checkbox' name='topping' value='cheese'> 奶酪 </label>
  16. <label><input type='checkbox' name='topping' value='onion'> 洋蔥 </label>
  17. <label><input type='checkbox' name='topping' value='mushroom'> 蘑菇 </label>
  18. </fieldset>
  19. <p><label>配送時間:<input type='time' name='delivery' min='11:00' max='21:00' step='900'></label></p>
  20. <p><button>提交訂單</button></p>
  21. </form>

二、表單元素

1、form標(biāo)簽:

           name屬性:主要用于之后的API:var pizzaForm = document.forms.pizza;

           autocomplete屬性:屬性值有on / off ,當(dāng)值為on時,鼠標(biāo)焦點(diǎn)到“姓名”的輸入框中時,下面會出現(xiàn)之前輸入過的值以備候選,候選值也會根據(jù)輸入情況更改;當(dāng)值為off時,也出現(xiàn)提示,就與瀏覽器的設(shè)置有關(guān)了。

           elements:包含:①該表單子孫表單控件(除圖片按鈕(<input type='image'>))(表單控件有 button、fieldset、input、keygen、object、output、select、textarea)

                                            ②歸屬于該表單的表單控件(除圖片按鈕),示例看下面的代碼:(動態(tài)節(jié)點(diǎn)集合)

  1. <form id='f'>
  2. <p><label><input name='a'></label></p><!--符合①-->
  3. <p><select name='b'><option>1</option></select></p><!--符合①-->
  4. </form>
  5. <p><label><input name='c'></label></p><!--不符合-->
  6. <p><label><input name='d' form='f'></label></p><!--符合②-->
             length:elements.length
2、獲取form表單中的表單控件:
  1. <form name='test'>
  2. <input name='a' />
  3. <input name='b' />
  4. </form>
  1. testForm.elements[0];
  2. testForm.elements['a'];
  3. testForm[0]; //form[index]
  4. testForm['a']; //form[name]

*form[name]:

---------------------返回id或name為指定名稱的表單控件(除圖片按鈕)

---------------------如果結(jié)果為空、則返回id為指定名稱的img元素

---------------------如果有多個同名元素,則返回這些元素的動態(tài)節(jié)點(diǎn)集合

---------------------一旦用指定名稱取過該元素,則不管該元素的id或者name怎么變化,只要節(jié)點(diǎn)還在頁面上均可使用原名稱獲取該元素:

  1. <form name='test'>
  2. <input name='a' />
  3. </form>

  1. testForm['a'];
  2. testForm.elements['a'];
  3. testForm['a'].name = 'b';
  4. testForm['a'];//<input name='b' />
  5. testForm.elements['a'];//null

3、接口:

-----reset()

可重置元素:input、keygen、output、select、textarea

觸發(fā)表單reset事件,阻止該事件的默認(rèn)行為可取消重置

元素重置時不再觸發(fā)元素上的change和input事件

示例:有一個文件選擇器,已經(jīng)選擇了一個文件,現(xiàn)在我們想要把這個選擇的文件刪除:

  1. <form name='file'>
  2. <input name='image' type='file' />
  3. </form>
  4. <script>
  5. fileForm['image'].value = ''; //根據(jù)瀏覽器的安全限制,這樣做是無法刪除已選中文件的
  6. fileForm.reset();
  7. </script>

-----submit()

-----checkValidity()

4、label標(biāo)簽

<label for='txtId' form='formId'></label>

主要通過for屬性關(guān)聯(lián)到相關(guān)的表單控件上

①、htmlFor

-------------------關(guān)聯(lián)表單控件激活行為,也就是說關(guān)聯(lián)之后,點(diǎn)擊label的行為與表單控件的行為保持一致

-------------------可關(guān)聯(lián)元素:button、input(除hidden外)、keygen、meter、output、progress、select、textarea

  1. <form class='f-hidden'>
  2. <input id='file' name='image' type='file'><!--0*0尺寸不可見-->
  3. </form>
  4. <label for='file' class='m-upload'>選擇圖片</label><!--上傳按鈕效果,這里最重要的就是將for屬性指到input id為file,這里點(diǎn)擊label就有與點(diǎn)擊input標(biāo)簽選擇文件行為相同的操作-->

②control

---------------------如果指定了for屬性,則為該for屬性對應(yīng)ID的可關(guān)聯(lián)元素

---------------------如果沒有指定for屬性,則為第一個子孫可關(guān)聯(lián)元素

  1. <label for='txtId'>文字<input name='desc'></label>
  2. <span id='txtId'>only for test content here</span>

在上面代碼中:a、指定了for屬性

                            b、for屬性對應(yīng)ID的元素span為非可關(guān)聯(lián)元素

                            c、label.control——>null

③form

----------------------關(guān)聯(lián)歸屬表單

----------------------可關(guān)聯(lián)元素:button,fieldset,input,keygen,label,object,output,select,textarea

----------------------只讀屬性,不可在程序中修改

label.setAttribute('form','newFormId');

5、input標(biāo)簽

①type

--------------------控件外觀

--------------------數(shù)據(jù)類型

--------------------默認(rèn)為text

示例:本地圖片預(yù)覽:

<input type='file' accept='image/*' multiple>

multiple表示可以多選,accept支持的屬性值:audio/*、video/*、image/*、不帶“;”的MIME type、以“.”開始的文件后綴名。
  1. file.addEventListener('change', function(event){
  2. var files = Array.prototype.slice.call(event.target.files,0);
  3. files.forEach(function(item){
  4. <strong>file2dataurl</strong>(item,function(url){
  5. var image = new Image();
  6. parent.appendChild(image);
  7. image.src = url;
  8. });
  9. });
  10. });

file2dataurl接口沒有實(shí)現(xiàn),思考。

6、select標(biāo)簽

  1. <select name='course'>
  2. <option>課程選擇</option>
  3. <optgroup label='1. DOM基礎(chǔ)'>
  4. <option value='1.1'>1.1 文檔樹</option>
  5. <option value='1.2'>1.2 節(jié)點(diǎn)操作</option>
  6. <option value='1.3'>1.3 元素遍歷</option>
  7. <option value='1.4'>1.4 樣式操作</option>
  8. <option value='1.5'>1.5 屬性操作</option>
  9. <option value='1.6'>1.6 表單操作</option>
  10. </optgroup>
  11. <optgroup label='2. 事件模型'>
  12. <option value='2.1'>2.1 事件類型</option>
  13. <option value='2.2'>2.2 事件模型</option>
  14. <option value='2.3'>2.3 事件應(yīng)用</option>
  15. </optgroup>
  16. </select>

①select屬性和接口:

select:name、value、multiple、options、selectedOptions、selectedIndex、add(element[,before])、remove([index])

optgroup:disabled 、label(對相關(guān)性較大的做分組,disabled表示當(dāng)前分組里的都是不可選的)

option:disabled、label、value、text、index、selected、defaultSelected

*創(chuàng)建選項(xiàng):

------document.createElement

------new Option([text[,value[,defaultSelected[,selected]]]])

這兩個方式的效果是一樣的。

  1. new Option('1.2 節(jié)點(diǎn)操作','1.2');
  2. //兩者等價
  3. var option = document.createElement('option');
  4. option.value = '1.2';
  5. option.textContent = '1.2 節(jié)點(diǎn)操作';

生成了:
<option value='1.2'>1.2 節(jié)點(diǎn)操作</option>

*添加選項(xiàng):

------insertAdjacentElement

------select.add

  1. //需插入的節(jié)點(diǎn)
  2. var option = new Option('1.0 概述','1.0');
  3. //opt11為參照點(diǎn)
  4. opt11.insertAdjacentElement(option,'beforeBegin');
  5. select.add(option,opt11);

*刪除選項(xiàng)

------removeChild

------select.remove

  1. opt12.parentNode.removeChild(opt12);
  2. //2為待刪除節(jié)點(diǎn)的索引值
  3. select.remove(2);

示例:級聯(lián)下拉選擇器

案例描述:兩個select選擇器,后一個選擇器根據(jù)前一個選擇的所選的內(nèi)容發(fā)生改變:

涉及到的知識點(diǎn):onchange、remove、add

  1. <form name='course'>
  2. <select name='chapter'>
  3. <option>請選擇章目錄</option>
  4. </select>
  5. <select name='section'>
  6. <option>請選擇節(jié)目錄</option>
  7. </select>
  8. </form>

接下來對章節(jié)的數(shù)據(jù)內(nèi)容進(jìn)行定義:
  1. var chapters = [
  2. {text:'1. DOM基礎(chǔ)',value:'1'},
  3. {text:'2. 事件模型',value:'2'}
  4. ];
  5. var sections = {
  6. 1:[
  7. {text:'1.1 文檔樹',value:'1.1'},
  8. {text:'1.2 節(jié)點(diǎn)操作',value:'1.2'},
  9. {text:'1.3 元素遍歷',value:'1.3'},
  10. {text:'1.4 樣式操作',value:'1.4'},
  11. {text:'1.5 屬性操作',value:'1.5'},
  12. {text:'1.6 表單操作',value:'1.6'}
  13. ],
  14. 2:[
  15. {text:'2.1 事件類型',value:'2.1'},
  16. {text:'2.2 事件模型',value:'2.2'},
  17. {text:'2.3 事件應(yīng)用',value:'2.3'}
  18. ]
  19. };

提取通用的接口:
  1. //用選定的數(shù)據(jù)列表填充選擇器
  2. function fillSelect(select,list){
  3. for(var i=select.length-1; i>0; i --){
  4. select.remove(i);
  5. }
  6. list.forEach(function(data){
  7. var option = new Option(data.text,data.value);
  8. select.add(option);
  9. });
  10. }
  11. //對首級的選擇器做填充
  12. fillSelect(chapterSelect,chapters);
  13. //章的選擇器會導(dǎo)致節(jié)的選擇器的變化
  14. chapterSelect.addEventListener('change', function(event){
  15. var value = event.target.value,
  16. list = sections[value] || [];
  17. fillSelect(sectionSelect,list);
  18. });

7、textarea

①屬性和接口:

name、value、select()(對內(nèi)容全選之后就會觸發(fā)這個接口)、selectionStart、selectionEnd、selectionDirection(用來控制shift+方向鍵的行為,當(dāng)值為forward時,改變的是selectionEnd,值為backward時,改變的是selectionStart)、setSelectionRange(start,end[,direction])、setRangeText(replacement[,start,end[,mode]])

@輸入提示

描述:比如QQ聊天時,對話框中輸入@就會出現(xiàn)好友列表,可以選擇其中的一個值填充到@后面,之后再輸入其他文本。

涉及到的知識點(diǎn):oninput、selectionStart、setRangeText

  1. textarea.addEventListener(
  2. 'input',function(event){
  3. var target = event.target,
  4. cursor = target.selectionStart;
  5. if(target.value.charAt(cursor - 1) === '@'){
  6. doShowAtList(function(name){
  7. var end = cursor+name.length;
  8. target.setRangeText(name,cursor,end,'end');
  9. });
  10. }
  11. }
  12. );


2、表單驗(yàn)證

  1. <form method='post' action='https://pizza./order' enctype='application/x-www-form-urlencoded'>
  2. <!--action屬性配置接收數(shù)據(jù)的地址,enctype指定編碼方式-->
  3. <p><label>姓名:<input name='custname' required></label></p>
  4. <p><label>電話:<input type='tel' name='custtel' required></label></p>
  5. <p><label>郵箱:<input type='email' name='custemail'></label></p>
  6. <fieldset>
  7. <legend> 披薩大小 </legend>
  8. <label><input type='radio' name='size' value='small' required></label>
  9. <label><input type='radio' name='size' value='medium' required></label>
  10. <label><input type='radio' name='size' value='large' required></label>
  11. </fieldset>
  12. <fieldset>
  13. <legend> 披薩配料 </legend>
  14. <label><input type='checkbox' name='topping' value='bacon'> 熏肉 </label>
  15. <label><input type='checkbox' name='topping' value='cheese'> 奶酪 </label>
  16. <label><input type='checkbox' name='topping' value='onion'> 洋蔥 </label>
  17. <label><input type='checkbox' name='topping' value='mushroom'> 蘑菇 </label>
  18. </fieldset>
  19. <p><label>配送時間:<input type='time' name='delivery' min='11:00' max='21:00' step='900'></label></p>
  20. <p><button>提交訂單</button></p>
  21. </form>

在必須要填寫的表單標(biāo)簽中添加“required”屬性,當(dāng)用戶沒有填寫完整時點(diǎn)擊提交按鈕就會馬上返回提示信息。

一、驗(yàn)證:

1、驗(yàn)證元素:

---------可驗(yàn)證元素:button、input、select、textarea

---------以下情況不做驗(yàn)證:

                 ①input && type = {hidden、reset、button}

                 ②button && type = {reset、button}

                 ③input / textarea && readonly

                 ④作為datalist的子孫節(jié)點(diǎn)

                 ⑤disabled

2、驗(yàn)證涉及到的屬性或接口:

element:willValidate(判斷表單提交時元素是否會被驗(yàn)證)、checkValidity()(用來驗(yàn)證元素,通過的話就會返回true,否則會觸發(fā)validate事件)、validity、validationMessage(顯示驗(yàn)證異常信息)、setCustomValidity(message)

①validity:存儲了驗(yàn)證過程中可能出現(xiàn)的錯誤驗(yàn)證信息

②自定義異常:

-------oninvalid事件

-------setCustomValidity接口

a、將必填字段的提示信息自定義設(shè)置,默認(rèn)為“請?zhí)顚懘俗侄??!?,改為“請輸入姓名!?/p>

  1. <form action='./api' method='post'>
  2. <p><label>姓名:<input name='username' required /></label></p>
  3. <p><button>submit</button></p>
  4. </form>

  1. input.addEventListener('invalid', function(event){
  2. var target = event.target;
  3. //如果是沒用輸入的話,就自定義異常信息
  4. if(target.validity.valueMissing){
  5. target.setCustomValidity('請輸入姓名!');
  6. }
  7. });

③禁止驗(yàn)證:

描述案例:當(dāng)一個input的type為number,而作用是輸入電話號碼,其中電話號碼帶有“-”,提交時就會顯示驗(yàn)證錯誤信息“請輸入一個數(shù)字”。(這種情況下設(shè)置type可能是為了喚起特定的鍵盤,這里就是數(shù)字鍵盤)

  1. <form action='./api' method='post' novalidate>
  2. <label>電話:<input type='number' name='tel' /></label>
  3. <button>submit</button>
  4. </form>


3、表單提交

一、隱式提交:

-------如:聚焦在輸入框時按回車提交表單

-------需滿足以下任一條件:

                 ①表單有非禁用的提交按鈕

                 ②沒有提交按鈕時,不超過一個類型為text、search、url、email、password、date、time、number的input元素

1、提交過程:

①根據(jù)表單enctype指定的值構(gòu)建要提交的數(shù)據(jù)結(jié)構(gòu)

②使用method指定的方式發(fā)送數(shù)據(jù)到action指定的目標(biāo)

1.1、構(gòu)建提交數(shù)據(jù)(瀏覽器):從可提交元素中提取數(shù)據(jù)組裝成指定的數(shù)據(jù)結(jié)構(gòu)的過程。

          可提交元素:button、input、keygen、object、select、textarea

1.2、編碼方式(enctype)

          可指定為以下三種方式之一:①application/x-www-form-urlencoded【默認(rèn)】

                                                              ②multipart/form-data

                                                              ③text/plain  (一般文件上傳使用這種方式)

以上三種編碼方式分別使用method='post'提交數(shù)據(jù):

  1. <form action='./api' method='post'>
  2. <input name='a' />
  3. <input name='b' />
  4. <input name='c' />
  5. <button>submit</button>
  6. </form>

enctype Content-Type數(shù)據(jù)格式組織形式
使用&分割的鍵值對
用回車換行分割的鍵值對
字節(jié)流

特殊案例

-------name='isindex' && type='text'

                    *編碼方式為application/x-www-form-urlencoded

                    *作為表單的第一個提交元素

                    *提交時只發(fā)送value值,不包含name

  1. <form action='./api' method='post'>
  2. <p><input name='isindex' /></p>
  3. <p><input name='a' /></p>
  4. <p><button>submit</button></p>
  5. </form>

提交111111、22222,則之后看到提交的數(shù)據(jù)為:111111&a=22222

-------name='_charset_' && type='hidden'

                    *沒有設(shè)置value值

                    *提交時value自動用當(dāng)前提交的字符集填充

  1. <form action='./api' method='post'>
  2. <input type='hidden' name='_charset_' />
  3. <p><input name='a' /></p>
  4. <p><button>submit</button></p>
  5. </form>

提交111111,而_charset_的值就會用當(dāng)前數(shù)據(jù)的編碼字符集來填充,則提交的數(shù)據(jù)為:_charset_=UTF-8&a=111111

2、submit() 提交

在表單提交中的一個重要接口就是submit(),除了用提交按鈕來提交數(shù)據(jù)之外,我們還可以調(diào)用form上的submit()接口來提交表單。

①onsubmit——不管用什么方式提交表單都會觸發(fā)onsubmit事件。

——表單提交事件

——在這個事件觸發(fā)的時候我們可以做一些提交之前的數(shù)據(jù)驗(yàn)證

——如果這個驗(yàn)證沒有通過,可以阻止事件的默認(rèn)行為來取消表單提交。

  1. form.addEventListener('submit', function(event){
  2. var notValid = false;
  3. var elements = event.target.elements;
  4. //TODO 處理自定義的驗(yàn)證規(guī)則
  5. if(notValid){
  6. event.preventDefault();
  7. }
  8. });

示例:無刷新表單提交

常用的可能是ajax,但這里用另外一種方式:

涉及到的知識點(diǎn):form、target、iframe

使用iframe做中間代理,結(jié)合表單的target。

說明:指定一個iframe的name,將form的target指向iframe的name,當(dāng)form表單的數(shù)據(jù)提交到服務(wù)器上,服務(wù)器返回的結(jié)果就會到iframe中,然后就只需要將iframe中的結(jié)果提交到頁面上就可以了。

  1. <iframe name='targetFrame' class='f-hidden'></iframe>
  2. <form action='./api' method='post' target='targetFrame'>
  3. <p><input name='a'></p>
  4. <p><input name='b' /></p>
  5. <p><button>submit</button></p>
  6. </form>


4、表單應(yīng)用

當(dāng)重新輸入時,錯誤信息就會消失。

一、登錄接口:

——請求地址:/api/login

——請求參數(shù):

                *telephone     手機(jī)號碼

                *password     密碼,MD5加密

——返回結(jié)果:

                *code       請求狀態(tài),200表示成功

                *result      請求結(jié)果數(shù)據(jù)

登錄表單:

  1. <form action='/api/login' class='m-form' name='loginForm' target='result' autocomplete='off'>
  2. <legend>手機(jī)號碼登錄</legend>
  3. <fieldset>
  4. <div class='msg' id='message'></div>
  5. <div>
  6. <label for='telephone'>手機(jī)號:</label>
  7. <input id='telephone' name='telephone' class='u-txt' type='tel' maxlength='11' required pattern='^0?(13[0-9]|15[012356789]|18[0236789]|14[57])[0-9]{8}$' /><br/>
  8. <span class='tip'>11位數(shù)字手機(jī)號碼</span>
  9. </div>
  10. <div>
  11. <label for='password'>密 碼:</label>
  12. <input id='password' name='password' type='password' class='u-txt' /><br/>
  13. <span class='tip'>至少6位,同時包含數(shù)字和字母</span>
  14. </div>
  15. <div><button name='loginBtn'>登 錄</button></div>
  16. </fieldset>
  17. </form>

  1. var form = document.forms.loginForm;//登錄表單的引用
  2. var nmsg = document.getElementById('message');//信息提示節(jié)點(diǎn)的引用

  1. /*控制提示消息的樣式*/
  2. .m-form .j-err{display:block;color:#FF0000;}
  3. .m-form .j-suc{display:block;color:#158226;}
  4. /*驗(yàn)證出錯時輸入框的效果*/
  5. .m-form .j-error{border-color:#f00;background-color: #FFE7E7;}
  6. /*標(biāo)示按鈕的禁用狀態(tài),用在登錄按鈕上*/
  7. .m-form .j-disabled{cursor:default;background-color:#ddd;}

①通用方法:

  1. //在信息提示節(jié)點(diǎn)上設(shè)置提示信息
  2. function showMessage(clazz,msg){
  3. if(!clazz){
  4. nmsg.innerHTML = '';
  5. nmsg.classList.remove('j-suc');
  6. nmsg.classList.remove('j-err');
  7. }else{
  8. nmsg.innerHTML = msg;
  9. nmsg.classList.add(clazz);
  10. }
  11. }
  12. //輸入驗(yàn)證失敗的邏輯
  13. function invalidInput(node,msg){
  14. showMessage('j-err',msg);
  15. node.classList.add('j-error');
  16. node.focus();
  17. }
  18. //當(dāng)用戶有輸入時,清除提示信息
  19. function clearInvalid(node){
  20. showMessage();
  21. node.classList.remove('j-error');
  22. }
  23. //提交表單以后,服務(wù)器沒有返回結(jié)果的這段時間,禁用登錄按鈕,防止用戶重復(fù)提交
  24. function disableSubmit(disabled){
  25. form.loginBtn.disabled = !!disabled;
  26. var method = !disabled?'remove':'add';
  27. form.loginBtn.classList[method]('j-disabled');
  28. }

②驗(yàn)證手機(jī)號:
  1. //驗(yàn)證手機(jī)號(使用驗(yàn)證邏輯)
  2. form.telephone.addEventListener('invalid', function(event){
  3. event.preventDefault();
  4. invalidInput(form.telephone,'請輸入正確的手機(jī)號碼');
  5. });

③驗(yàn)證密碼:
  1. //驗(yàn)證密碼,注意:驗(yàn)證時機(jī)是提交表單的時候,不是點(diǎn)擊提交按鈕的時候。原因:用戶提交表單不一定是要點(diǎn)擊提交按鈕,還可以隱式提交
  2. form.addEventListener('submit', function(event){
  3. //密碼驗(yàn)證
  4. var input = form.password,
  5. pswd = input.value,
  6. emsg = '';
  7. if(pswd.length<6){
  8. emsg = '密碼長度必須大于6位';
  9. }else if(!/\d/.test(pswd)||!/[a-z]/i.test(pswd)){
  10. emsg = '密碼必須包含數(shù)字和字母';
  11. }
  12. //密碼驗(yàn)證不通過
  13. if(!!emsg){
  14. event.preventDefault();
  15. invalidInput(input,emsg);
  16. return;
  17. }
  18. //TODO 提交數(shù)據(jù)
  19. });

④表單提交:
  1. //表單提交
  2. form.addEventListener('submit', function(event){
  3. //TODO 密碼驗(yàn)證
  4. input.value = md5(pswd);
  5. //禁用提交按鈕
  6. disableSubmit(true);
  7. });

⑤狀態(tài)恢復(fù):
  1. //驗(yàn)證失敗之后的狀態(tài)恢復(fù)
  2. form.addEventListener('input', function(event){
  3. //還原錯誤狀態(tài)
  4. clearInvalid(event.target);
  5. //還原登錄按鈕狀態(tài)
  6. disableSubmit(false);
  7. });

案例介紹:利用iframe無刷新提交
  1. <iframe name='result' id='result' style='display:none;'></iframe>
  2. <form target='result' action='/api/login' class='m-form' name='loginForm'>
  3. </form>

  1. //從iframe中取出服務(wù)器返回結(jié)果并做處理
  2. var frame = document.getElementById('result');
  3. frame.addEventListener('load', function(event){
  4. try{
  5. var result = JSON.parse(frame.contentWindow.document.body.textContent);
  6. //還原登錄按鈕狀態(tài)
  7. disableSubmit(false);
  8. //識別登錄結(jié)果
  9. if(result.code === 200){
  10. showMessage('j-suc','登錄成功!');
  11. form.reset();
  12. }
  13. }catch(ex){
  14. //ignore
  15. }
  16. });


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产户外勾引精品露出一区| 91后入中出内射在线| 国产一二三区不卡视频| 免费啪视频免费欧美亚洲| 亚洲男人天堂成人在线视频| 国产一级精品色特级色国产| 欧美日韩精品综合在线| 丰满人妻熟妇乱又乱精品古代| 午夜久久久精品国产精品| 日韩欧美一区二区久久婷婷 | 久久国产亚洲精品成人| 欧美日韩视频中文字幕| 亚洲一区在线观看蜜桃| 国产午夜福利片在线观看| 久久综合亚洲精品蜜桃| 好吊色欧美一区二区三区顽频| 日本av在线不卡一区| 四季av一区二区播放| 国产精品久久三级精品| 久草精品视频精品视频精品| 日韩一区二区三区嘿嘿| 日本乱论一区二区三区| 精品丝袜一区二区三区性色| 国产精品刮毛视频不卡| 日韩欧美一区二区不卡看片| 九九九热视频最新在线| 亚洲淫片一区二区三区| 久热99中文字幕视频在线| 欧美在线视频一区观看| 一区二区三区国产日韩| 日本亚洲精品在线观看| 亚洲最新一区二区三区| 成人精品欧美一级乱黄| 千仞雪下面好爽好紧好湿全文| 又黄又色又爽又免费的视频| 国产女同精品一区二区| 中文精品人妻一区二区| 伊人国产精选免费观看在线视频| 好吊日视频这里都是精品| 日本人妻熟女一区二区三区| 国产黑人一区二区三区|