這篇文章的主要目的是介紹表單相關的知識,如表單基礎知識、文本框腳本相關用法、選擇框腳本相關用法以及等知識。雖然在現代web開發中,不多會使用form默認行爲提交表單數據,而是會禁用默認行爲,而後使用Ajax方式經過POST請求異步提交表單數據。可是這並不表明form表單不重要了。form表單仍然是提交表單最快的方式,由於JavaScript提供了許多屬性和方法讓咱們快速獲取表單字段的值。因此,對form的理解和掌握仍是頗有必要的。javascript
獲取HTML中的Form標籤能夠經過id、class、name屬性獲取,或者直接經過form標籤獲取。固然,也可使用document.forms
獲取HTML中全部表單元素,會返回一個NodeList對象。java
說一個重要的web
elements: document.forms[0].elements
返回類數組對象,包含該form表單下全部表單字段。能夠經過表單字段的name屬性或者索引訪問.正則表達式
let form = document.forms[0] form.element[0] === form.element['index-0']
在form表單上的方法有submit、reset方法。在現代web開發中,都會阻止form表單提交的默認行爲。當沒有參數時,能夠在不點擊按鈕的狀況下將全部表單字段的值向服務器提交數據。一般,存在如下三種按鈕能夠提交表單數據。數組
<input type="submit" value='提交' /> <button type='submit'>提交</button> <input type="image" src='pic.png' />
submit: 當給form表單綁定submit事件,在點擊圖像按鈕或者type爲submit的按鈕會提交表單數據。此時能夠經過事件對象阻止表單全局提交的默認行爲。在提交表單時,爲避免用戶屢次點擊致使屢次提交的問題,能夠在提交後禁用提交按鈕。瀏覽器
都比較簡單,有以下:服務器
<input type="text" autofocus />
。支持此事件的瀏覽器包括IE10+、Chrome、Firefox。因此支持的瀏覽器的autofocus會返回true,不支持時會返回空字符串。focus()、blur():一般會結合blur方法使用。好比在DOMContentLoaded事件以後讓某個input元素得到焦點,讓用戶能夠直接輸入。異步
document.addEventLitener('DOMContentLoaded', e => { let input = docuemnt.querySelector('.input-1') input.focus() }, false)
focus、blur事件:在實際業務中,能夠結合使用focus和blur事件。如input節點得到焦點時,改變input元素顏色。在失去焦點時,將背景顏色重置。url
let input = document.querySelector('.input-0') input.addEventListener('focus', e => { e.target.style.backgroundColor = '#ccc' }, false) input.addEventListener('blur', e => { e.target.style.backgroundColor = '#fff' }, false)
change事件:對於input和textarea元素,當它們從得到焦點到失去焦點而且value值發生改變時,纔會觸發change事件。而對於select元素,只要value值發生改變時就會觸發change事件。換句話說,沒有失去焦點也會觸發change事件。這個細節須要注意。代理
除了以上表單字段的共有屬性和方法以外,文本框存在本身的一些屬性和操做文本的一些方法。
// type爲number時,能夠指定min,max,step(表示某個值得倍數)屬性 <input type="number" min='0' max='100' step='5' name='count'> // 此時正則默認添加了^, $,即如下正則等於'^\d+$' <input type='text' pattern='\d+'>
1.select方法:input和textarea元素都支持selct方法。這個方法不接受任何參數,表示選擇某個文本框元素的全部文本
// 當input元素得到焦點是選擇文本 let input = document.querySelector('.input-1') input.addEventListener('focus', e => { e.target.select() }, false)
2.setSelectionRange方法:這個方法用於選擇部分文本內容。接受兩個參數,起始位置和結束位置。HTML5新增的方法。IE9+以上瀏覽器支持。
// 當input得到焦點時,選擇文本中的第二個值 let input = document.querySelector('.input-1') input.addEventListener('focus', e => { let target = e.target console.log(target.setSelectionRange(1, 2)) }, false)
3.select事件:當文本框元素中的文本被選中時,就會觸發select事件。只要選中文本就會觸發,不須要全選。
4.selectionStart, selectionEnd屬性:這兩個屬性用於或者用戶選中的文本內容。所以,能夠與select事件結合使用,獲取用戶選中的文本內容。HTML5新增的兩個屬性。IE9+以上瀏覽器支持。
let input = document.querySelector('.input-1') input.addEventListener('select', e => { let target = e.target let start = target.selectionStart let end = target.selectionEnd console.log(target.value.slice(start, end)) }, false)
文本框的過濾輸入主要是某些文本的輸入是有條件的。好比說須要input元素中只容許輸入數字。這時候就須要用到文本的過濾。基本思路以下
1.經過監聽keypress事件,判斷輸入時的字符是不是數字。經過charCode判斷。keypress事件會在用戶按下鍵盤上的【字符鍵】時觸發。
2.若是不是,則取消默認行爲,即取消文本的輸入。
let input = document.querySelector('.input-1') input.addEventListener('keypress', e => { let charCode = e.charCode if (!/[\d+.+-]/g.test(String.fromCharCode(charCode))) { e.preventDefault() } }, false)
此方法經過charCode屬性來判斷用戶輸入的字符是不是數字字符,若是是則能夠輸入,若是不是則禁止輸入。這裏要注意的是,不能經過input的value屬性來判斷。由於keydown和keypress事件會在value改變以前觸發,而keyup事件則是在value發生改變以後觸發。所以,keypress獲取value值是上一次的值,可是keypress事件能夠獲取到按下鍵盤時的charCode屬性,而後經過String對象的fromCharCode轉成對應的字符,根據此字符作一次正則驗證便可。同時,charCode屬性只有在keypress事件才存在,在keydown和keyup事件中都會返回0。
這種應用主要用於手機號碼上。如手機號碼能夠分爲'334'的結構。所以能夠建立三個input,當輸入完畢時自動切換焦點到下一個input上。
// 必須設置最大值 <input type="text" name='text1' maxlength="3"> <input type="text" name='text2' maxlength="3"> <input type="text" name='text3' maxlength="4"> // 當value的length等於maxleng時,發生跳轉 function judge (len, max, target, form) { if (len === max) { let length = form.elements.length for (let i = 0; i < length; i++) { if (target === form.elements[i]) { if (form.elements[i + 1]) { form.elements[i + 1].focus() } } } } } // 給三個input綁定keyup事件,經過事件代理方式。 document.addEventListener('keyup', e => { let target = e.target let form = target.form let len = target.value.length let maxLen = target.maxLength switch (target.name) { case 'text1': judge(len, maxLen, target, form) break case 'text2': judge(len, maxLen, target, form) break case 'text3': judge(len, maxLen, target, form) break } }, false)
選擇框是經過select和option元素組合而成的。除了表單字段共有的屬性和方法以外,在這兩個元素上提供了其餘的屬性和方法。目的是爲了更加方便的操做選擇框元素。