文章出處

前言

 最近在用Polymer增強form,使其支持表單的異步提交,但發現明明訂閱了onsubmit和submit事件,卻怎么也觸發不了。下面我們將一一道來。

提交表單的方式

  1. 表單僅含一個以下的元素時,該元素得到焦點,按回車鍵,即可發起表單提交。

    input[type=text]
    input[type=password]
    input[type=email]
    input[type=url]
    input[type=tel]
    input[type=number]
    input[type=search]

    示例:

    <form>
    <label for="name"></label>
    <input type="text" id="name" name="name">
    <select id="sex" name="sex">
        <option value="0">male</option>
        <option value="1">female</option>
    </select>
    </form>
  2. 表單含兩個或以上的上述元素時,在表單中添加一個input[type=submit]子元素,或在表單外添加一個input[type=submit form=表單ID]的元素,那么當上述元素得到焦點,按回車鍵,即可發起表單提交。
    示例:

    <form>
    <label for="name"></label>
    <input type="text" id="name" name="name">
    <label for="age"></label>
    <input type="number" id="age" name="age" value="0">
    <input type="submit" value="submit">
    </form>

input[type=submit]換成button效果一樣,IE下button的type屬性默認為button,其他瀏覽器(W3C標準)則是submit。
因此使用button時記得顯式設置type屬性值。

  1. 通過調用表單元素的submit方法。
    示例:

    <form>
    <label for="name"></label>
    <input type="text" id="name" name="name">
    <label for="age"></label>
    <input type="number" id="age" name="age" value="0">
    <input type="button" value="submit">
    </form>
    <script>
    var btn = document.querySelector('input[type="button"]')
    , form = document.querySelector('form')
    btn.addEventListener('click', function(e){
    form.submit()
    })
    </script>
  2. 通過觸發表單的submit事件
    示例1, IE 678:

    var form = document.querySelector('form')
    form.fireEvent('onsubmit')
    form.submit()

    示例2,DOM Level 2 Event

    var e = document.createEvent('HTMLEvents')
    e.initEvent('submit', true, true)
    var form = document.querySelector('form')
    form.dispatchEvent(e)

    示例3,DOM Level 3 Event

    var e = new Event('submit')
    var form = document.querySelector('form')
    form.dispatchEvent(e)

    示例4,jQuery

    $('form').trigger('submit')

各種提交方式的背后

就onsubmit函數和submit事件而言

  1. 方式1,方式2和方式4均可依次調用onsubmit函數和觸發submit事件,因此可以在onsubmit函數或submit事件處理函數中禁止執行默認行為來實現表單的異步提交;
  2. 方式3既不會調用onsubmit函數,也不會觸發submit事件。

還有HTML5表單合法性驗證呢!

 HTML5對表單作了增強,其中最耀眼的可謂是合法性驗證這一部分。首先我們要明確一點的是,驗證發生在與input等表單控件發生交互時(輸入,點擊,腳本修改其值等),而不是提交表單時才觸發驗證。然后再根據表單的配置和觸發表單提交的方式,決定合法性驗證的結果是否會阻止表單的提交。

前提:form.novalidate為false

<form>
    <input type="text" id="name" name="name" required>
</form>
  1. 方式1和方式2,若input#name內容為空,則彈出非法內容警告,并阻止表單提交,不執行onsubmit和觸發submit事件
  2. 方式3,直接提交表單
  3. 方式4,若input#name內容為空,不彈出非法內容警告,更不會阻止表單提交, 而是執行onsubmit和觸發submit事件
    因此要方式4實現與方式1,2的效果可以這樣處理

    var e = new Event('submit')
    var form = document.querySelector('form')
    form.addEventListener('submit', function(e){
    if (!form.novalidate && form.reportValidity()){
        e.preventDefault()
    }
    })
    form.dispatchEvent(e)

     到這里對表單提交的方式和不同方式引起后續不同的效果有了解,但不稍微深入上面引入關于合法性驗證的內容心里總是發癢,下面我們繼續挖一挖吧!

說說HTML5下的表單合法性驗證

 說到合法性驗證,那必須說到一個新增的類型ValidityState

@interface ValidityState
@description input等表單控件通過validity屬性獲取
@prop {Boolean} valid - 內容是否符合規定
@prop {Boolean} valueMissing - 是否違反必填約束
@prop {Boolean} typeMismatch - 是否違反類型約束,如type=url|email|number等約束
@prop {Boolean} badInput - 是否為無效輸入(無法轉換為目標類型),如number輸入了非數字
@prop {Boolean} tooLong - 是否超長
@prop {Boolean} tooShort - 是否長度不足
@prop {Boolean} stepMismatch - 是否符合step值設置的間隔
@prop {Boolean} rangeUnderflow - 是否小于最小值
@prop {Boolean} rangeOverflow - 是否大于最大值
@prop {Boolean} patternMismatch - 是否違反正則
@prop {Boolean} customError - 是否存在自定義錯誤信息

另外,表單控件還有其他屬性、方法和事件是和合法性驗證相關的

@prop {Boolean} willValidate - 是否啟用合法性校驗,只要設置了required等合法性驗證屬性即表示啟用
@prop {String} validationMessage - 校驗失敗時的提示信息
@method setCustomValidity([{String} msg='']):undefined - 設置自定義錯誤信息,設置為undefined或空字符串,表示不存在自定義錯誤信息
@event invalid - 調用表單控件的checkValidity()或reportValidity(),非法時觸發該事件

下面的方法,form和input等表單控件均擁有
@method checkValidity():Boolean - 檢查是否符合校驗約束,若不符合則觸發相應的表單控件的invalid事件
    form.addEventListener('submit', function(){
        form.checkValidity()
    })
@method reportValidity():Boolean - 功能和checkValidity一樣,但另外會以瀏覽器定義的方式顯示提示信息

總結

 尊重原創,轉載請注明來自:尊重原創,轉載請注明來自:http://www.cnblogs.com/fsjohnhuang/p/6843528.html ^_^肥仔John


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()