最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js瀏覽器html5表單驗證

 更新時間:2016年10月17日 09:40:39   作者:會編程的銀豬  
這篇文章主要為大家詳細介紹了js瀏覽器html5表單驗證,具有一定的參考價值,感興趣的小伙伴們可以參考一下

html5表單添加了很多類型的表單,而且還自帶驗證的功能。在移動端,手機等設(shè)備能夠根據(jù)不同的input類型彈出不同的鍵盤,例如iphone彈的鍵盤

但是由于不同的瀏覽器對不合法輸入提示文案不一致,樣式也不一樣,并且老的瀏覽器不兼容(IE9及以下),導(dǎo)致了在生產(chǎn)環(huán)境中比較少見到。例如對于郵箱格式的檢驗,不同瀏覽器的效果如下:

Chrome

Firefox

IE

safari

html5的表單跨瀏覽器有很大的問題

具體來說存在三個問題:

(1) 輸入框blur的時候不會觸發(fā)檢查,只有在點提交時才觸發(fā),但是一般是希望用戶一旦離開這個輸入框就對其輸入進行檢查

(2) 提示控件的UI差異很大,safari還不會觸發(fā)提示控件,一些瀏覽器如IE會給非法的輸入框添加一個紅色的邊框

(3) 文案是寫死的,并且不同瀏覽器的文案不一致,其中應(yīng)該以Chrome的提示最好

一、跨瀏覽器的表單驗證插件

為解決這些問題,網(wǎng)上有一些插件,如html5 Form,做了跨瀏覽器的處理,但是使用起來效果并不是十分讓人滿意,html5 Form在safari下面就失效了。在多方查找和嘗試未果之下,筆者自已寫了一個跨瀏覽器的表單檢測插件,效果如下:

Chrome

Firefox

IE

safari

插件效果示例:解決跨瀏覽器問題

1. 統(tǒng)一UI

這個插件解決了上面的問題,首先是統(tǒng)一了UI,模擬了Chrome的提示效果,UI的樣式和顯示位置都是一致的,并且可以自定義。對于文案問題提供了是否使用瀏覽器默認文案的選項,因為考慮到有些瀏覽器如Chrome的提示比較智能,例如上面的郵箱文案,如果不使用則自定義文案。

2. 支持異步驗證

另外一個強大的功能是支持異步驗證,如驗證用戶名是否存在:

插件支持異步驗證

3. 支持多重類型規(guī)則驗證

還有,支持不同類型的規(guī)則驗證,如必填/格式/自定義,例如對電話號碼的驗證有兩個要求,一個是必填,另外一個是符合電話號碼的格式:

支持不同規(guī)則類型的驗證

4. 能夠中英文切換

還考慮到了雙語站中英文切換的問題:

支持中英文切換

二、插件使用方法

1. 最簡單的使用

插件已經(jīng)上傳到github,里面包含了一個demo,demo的效果如下:

form的html結(jié)構(gòu):

<form class="sign-up">
 <label>郵箱地址</label>
 <input type="email" name="account" t="email" required="">
 <label>密碼</label>
 <input type="password" name="password" pattern=".{6,20}" pm="密碼要在6到20位之間" required="">
 <label>確認密碼</label>
 <input type="password" name="confirm-pwd">
 <input id="confirm-sign" type="submit" value="注冊">
 <p></p>
 </form>

     上面第3行,定義了input的type="email",還要再寫多一個t="email"主要是因為IE10以下的瀏覽器會把不認識的type強制改成text。

     無關(guān)的CSS略。有了上面的html結(jié)構(gòu)之后,只需要初始化插件就可以了

new Form($(".sign-up")[0], {
 errorMsgClass: "error", //錯誤提示框的類名,用于自定義樣式
 errorInputClass: "invalid", //input無效的類名,用于自定義樣式
}, submit);

function submit(){
 console.log("表單驗證成功,準備提交");
 //提交操作 
}

      執(zhí)行new From的時候傳了3個參數(shù),第一個是form的DOM元素,第二個參數(shù)是驗證規(guī)則的一些配置,第三是驗證成功的回調(diào)函數(shù)。對應(yīng)如下:

var Form = function(form, checkOpt, submitCallback){
 //...
}

第二個參數(shù)checkOpt有兩個屬性errorMsgClass和errorInputClass用來自定義樣式。

最簡單的初始化,能夠?qū)崿F(xiàn)required屬性、pattern屬性和類型檢驗生效。pattern使用正則表達式,其錯誤提示信息放在pm屬性里,如上面的 pm="密碼要在6到20位之間" 。

2. 添加自定義檢驗

上面的密碼需要保證兩次的輸入一致,在checkOpt里面添加自定義驗證:

 checkOpt.rule = {
 "confirm-pwd": {
 check: checkPwdIdentity, //自定義檢驗函數(shù)
 msg: "兩次密碼輸入不一致" //出錯提示信息
 }
 } 
 
 function checkPwdIdentity(){
 if(this.form["password"].value !== this.form["confirm-pwd"].value){
 return false;
 }
 return true;
 }

如上所示,添加了一個rule屬性,key值為input的name屬性,value值包含一個自定義的檢驗函數(shù)和出錯信息

3. 自定義異步檢驗

有些數(shù)據(jù)需要向服務(wù)請求檢驗,如檢驗賬戶是否存在

checkOpt.rule.account = {
 check: checkAccountExist,
 msg: "賬戶已存在!",
 async: true //標志位,說明是異步的檢驗
};

function checkAccountExist(failCallback, successCallback){
 var input = this;
 util.ajax("/register/hasUser", {account: this.value}, function(data){
 //如果用戶存在則調(diào)用failCallback,讓插件添加一個錯誤提示
 if(data.isUser === true){
 failCallback();
 }
 //成功則調(diào)用成功的回調(diào)函數(shù)
 else{
 successCallback();
 }
 });
 }

在回調(diào)函數(shù)里面?zhèn)鬟M兩個參數(shù),如果檢驗失敗則執(zhí)行第一個參數(shù),成功則執(zhí)行第二個參數(shù),為插件所用。

4. 添加自定義類型出錯提示

Form已經(jīng)提供了一套默認類型出錯提示:

Form.prototype.validationMessage_cn = {
 email: '無效的郵箱格式',
 number: '無效的數(shù)字格式',
 url: '無效的網(wǎng)址格式',
 password: '格式無效',
 text: '格式無效'
};

      你也可以自定義一個,將上面的文案換掉即可,暫時沒有提供參數(shù)

      另外可以取消掉瀏覽器提供的文案,用上面的默認文案

//如果瀏覽器的語言不是中文的話,就不要使用英文的文案了,雙語站時候適用
checkOpt.disableBrowserMsg = !(navigator.language || navigator.userLanguage).match(/cn/i)

      還可以指定Form使用的語言:

//雙語站切換時適用
checkOpt.lang = "cn"; //或者en
 

三、插件源碼解析

插件的代碼并不是很復(fù)雜,只是需要考慮很多細節(jié)。

1. 為非html5瀏覽器添加checkValidity函數(shù)

如果沒有checkValidity函數(shù)的話就給它添加一個,核心代碼見Github,這里不進行詳細說明。

 var input = document.createElement("input");
 if(!input.checkValidity){
 HTMLInputElement.prototype.checkValidity = function(){
 //詳細代碼見github
 }
 }
 

2. 添加錯誤提示

重點是計算提示顯示的位置,

Form.prototype.addErrorMsg = function(input, msg){

}

3. 異步檢驗的實現(xiàn)

異步檢驗難點在于,什么時候執(zhí)行submit回調(diào)。解決方案是給每個input添加一個hasCheck屬性,如果檢查通過則設(shè)置為true,一旦focus了就設(shè)為false,blur則觸發(fā)檢查。只有所有的input都有了hasCheck為true時才能執(zhí)行submit回調(diào)。下面的checkAsync的第二個參數(shù),點提交時設(shè)置成true,而blur驗證則為false

Form.prototype.checkAsync = function(input, doesSubmit){
 name = input.name;
 var rule = input.form.Form.checkOpt.rule;
 rule[name]["check"].call(input, 
 //檢驗失敗回調(diào)函數(shù)
 function(){
 var Form = input.form.Form;
 Form.addErrorMsg(input, Form.checkOpt.rule[name].msg);
 },
 //檢驗成功回調(diào)函數(shù) 
 function(){
 input.hasCheck = true;
 if(doesSubmit){
 input.form.Form.tryCallSubmit(input);
 }
 });
};

代碼的第14行檢查除submit外所有的input是否為hasCheck為true,如果有則執(zhí)行submit callback。    

 現(xiàn)在這個Form插件只支持text/password/url/email/number這幾種input,應(yīng)該可以滿足大部份的表單提交,如果需要,可再繼續(xù)完善。 

 個人博客:http://yincheng.site/html5-form

參考:

1. Making HTML5 Form backwards compatible

2. Building HTML5 Form Validation Bubble Replacements

3. Github工程

本文已被整理到了《jquery表單驗證大全》、《JavaScript表單驗證大全》,歡迎大家學(xué)習(xí)閱讀。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript建立一個語法高亮輸入框?qū)崿F(xiàn)思路

    JavaScript建立一個語法高亮輸入框?qū)崿F(xiàn)思路

    通常網(wǎng)站自帶的textarea編輯器不能滿足我們的需求比如高亮顯示代碼等,在這篇文章中,我將使用JavaScript庫ACE來創(chuàng)建一個輸入框效果,該腳本允許開發(fā)人員創(chuàng)建支持語法高亮的輸入框,感興趣的你可不要錯過了哈
    2013-02-02
  • javascript幀動畫(實例講解)

    javascript幀動畫(實例講解)

    下面小編就為大家?guī)硪黄猨avascript幀動畫(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • excel操作之Add Data to a Spreadsheet Cell

    excel操作之Add Data to a Spreadsheet Cell

    excel操作之Add Data to a Spreadsheet Cell...
    2007-06-06
  • JS數(shù)組返回去重后數(shù)據(jù)的方法解析

    JS數(shù)組返回去重后數(shù)據(jù)的方法解析

    本文主要分享了Js數(shù)組返回去重后的數(shù)據(jù)的實例代碼。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • 在JavaScript中創(chuàng)建對象的可行方法小結(jié)

    在JavaScript中創(chuàng)建對象的可行方法小結(jié)

    在Web前端開發(fā)中,JavaScript是一門功能強大的語言,其核心之一便是對象的創(chuàng)建與操作,對象是JavaScript中數(shù)據(jù)結(jié)構(gòu)的重要組成部分,本文將深入探討JavaScript中創(chuàng)建對象的各種方法,并結(jié)合代碼示例和實際開發(fā)經(jīng)驗進行詳細講解,需要的朋友可以參考下
    2025-03-03
  • Bootstrap 3多級下拉菜單實例

    Bootstrap 3多級下拉菜單實例

    這篇文章主要為大家詳細介紹了Bootstrap 3多級下拉菜單實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • javascript實現(xiàn)數(shù)字倒計時特效

    javascript實現(xiàn)數(shù)字倒計時特效

    這篇文章主要介紹了javascript實現(xiàn)網(wǎng)頁倒計時數(shù)字時鐘效果,是一款非常實用的javascript倒計時特效,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-03-03
  • 簡單使用webpack打包文件的實現(xiàn)

    簡單使用webpack打包文件的實現(xiàn)

    這篇文章主要介紹了簡單使用webpack打包文件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • JavaScript實現(xiàn)文件下載的14種方法總結(jié)大全

    JavaScript實現(xiàn)文件下載的14種方法總結(jié)大全

    在JavaScript中實現(xiàn)文件下載的功能可以通過多種方式實現(xiàn),這篇文章主要給大家介紹了關(guān)于JavaScript實現(xiàn)文件下載的14種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • JS遍歷JSON數(shù)組及獲取JSON數(shù)組長度操作示例【測試可用】

    JS遍歷JSON數(shù)組及獲取JSON數(shù)組長度操作示例【測試可用】

    這篇文章主要介紹了JS遍歷JSON數(shù)組及獲取JSON數(shù)組長度操作,涉及javascript簡單json數(shù)組遍歷與運算相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12

最新評論

砚山县| 宁化县| 班玛县| 鲁甸县| 吴川市| 留坝县| 交城县| 阳曲县| 西乌珠穆沁旗| 舟山市| 康平县| 五台县| 新和县| 宝坻区| 于都县| 开鲁县| 沂源县| 囊谦县| 荆门市| 高台县| 专栏| 澄迈县| 凌海市| 德安县| 云浮市| 南华县| 娱乐| 准格尔旗| 珠海市| 阿勒泰市| 太湖县| 乾安县| 平顶山市| 永年县| 安多县| 黄大仙区| 鄂托克旗| 晋江市| 乌拉特中旗| 镇康县| 枞阳县|