表單元素
從 HTML 到 HTML5, 表單相關的元素已經得到了很大的擴充, 基本上能夠滿足我們常見的需求。但在實際工作中, 因為互動或瀏覽器相容的需要, 有時候不得不對原生的表單元素進行擴充或模擬。但在此之前, 清楚的了解並掌握各種表單元素還是很重要的。在本文中, 我們將對表單元素 (預設是指 HTML5 表單元素)進行詳細的闡述。
form
●form 會自動處理submit 事件(submit 事件
●form 會自動處理submit 事件(submit 事件通常由校類驗,使用form.novalidate 可以關閉原生的validate●form 會根據每個表單元素的name 取得對應的使用者輸入, 然後將form data 以query string 的形式加入action 屬性對應的url 後面。預設的請求方法是 GET, 預設的action 是目前的 url。 ●event.target.elements 將會傳回所有可互動的元素<form novalidate> <input name='username' required/> <input name='passworkd' type='password' required/> <input name='email' type='email'/> <input type='submit' value='submit'/> </form>
可交互型elements
需要跟用戶進行交互,並獲得用戶輸入的這一類表單元素,我們把它們歸類為可交互型表單元素。 下面列舉出來了一些:●input: 常用的type 有checkbox, tel, number, email 等●textarea●select●option型資訊, 不需要跟使用者互動的表單元素,我們把它們歸類為回饋表單元素。 下面列舉出來了一些:
●meter
●output
<form oninput="result.value=parseInt(a.value)+parseInt(b.value)"> <input type='number' value='50' name='a' /> <input type='number' value='10' name='b' /> <output name='result'>60</output> </form>
對於output, 可以在form.oninput 設定計算出來的value
型群組的這一類表單元素, 我們把他們歸類為分組型表單元素。 下面列舉了一些:●fieldset
●optgroup<form> <select> <optgroup label='group1'> <option>1</option> <option>2</option> <option>3</option> </optgroup> <optgroup label='group2'> <option>4</option> <option>5</option> <option>6</option> </optgroup> <optgroup label='group3'> <option>7</option> <option>8</option> <option>9</optioin> </optgroup> </select> </form>
label
●opt 可與對應關聯了id 的交互個, 控制第一個●不建議嵌套label<form> <fieldset> <legend>Title</legend> <label for='radio'>Click me</label> <input type='radio' id='radio'/> </fieldset> </form>
<form> <fieldset> <legend>用户信息</legend> <label> 男 <input type='radio' name='gender' id='male' /> </label> <label> 女 <input type='radio' name='gender' id='female'/> </label> </fieldset> </form>
●對於複雜結構的name 可以使用keyPath field: {
name: String,
value: String || String[]
}
一個完整的實作
參考qs
一個完整的實作
參考qs
一個完整的實作參考qs
阻止事件●checkbox 需要拿checked 而不是value●select-multiple 需要存多個值●除了以上幾個特殊的交互元素之外, 其他的都默認從value 中去取值form. htmlconst fromKeyValues = { 'user.name': 'Tom', 'user.phone[0].number': '123456', 'user.phone[0].type': 'mobile' }; const fromValues = { user: { name: 'Tom', phone: [ { number: '123456', type: 'mobile' } ] } };
form.js
<form> <fieldset> <legend>Login</legend> <input name='username' placeholder='username' minlength='2'/> <input name='password' type='password' placeholder='password'/> <label> remember password <input name='checkbox' type='checkbox'/> </label> </fieldset> <fieldset> <p class="gender"> <legend>More Info</legend> <label> 男 <input name='gender' type='radio' value='male' /> </label> <label> 女 <input name='gender' type='radio' value='female' /> </label> </p> <select name='select' multiple> <option>1</option> <optgroup label='2'> <option>2.1</option> <option>2.2</option> </optgroup> </select> </fieldset> <button type='submit'>Submit</button></form>