js瀏覽器html5表單驗證
html5表單添加了很多類型的表單,而且還自帶驗證的功能。在移動端,手機(jī)等設(shè)備能夠根據(jù)不同的input類型彈出不同的鍵盤,例如iphone彈的鍵盤
但是由于不同的瀏覽器對不合法輸入提示文案不一致,樣式也不一樣,并且老的瀏覽器不兼容(IE9及以下),導(dǎo)致了在生產(chǎn)環(huán)境中比較少見到。例如對于郵箱格式的檢驗,不同瀏覽器的效果如下:
Chrome
Firefox
IE
safari
html5的表單跨瀏覽器有很大的問題
具體來說存在三個問題:
(1) 輸入框blur的時候不會觸發(fā)檢查,只有在點提交時才觸發(fā),但是一般是希望用戶一旦離開這個輸入框就對其輸入進(jìn)行檢查
(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的樣式和顯示位置都是一致的,并且可以自定義。對于文案問題提供了是否使用瀏覽器默認(rèn)文案的選項,因為考慮到有些瀏覽器如Chrome的提示比較智能,例如上面的郵箱文案,如果不使用則自定義文案。
2. 支持異步驗證
另外一個強(qiáng)大的功能是支持異步驗證,如驗證用戶名是否存在:
插件支持異步驗證
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>確認(rèn)密碼</label> <input type="password" name="confirm-pwd"> <input id="confirm-sign" type="submit" value="注冊"> <p></p> </form>
上面第3行,定義了input的type="email",還要再寫多一個t="email"主要是因為IE10以下的瀏覽器會把不認(rèn)識的type強(qiáng)制改成text。
無關(guān)的CSS略。有了上面的html結(jié)構(gòu)之后,只需要初始化插件就可以了
new Form($(".sign-up")[0], { errorMsgClass: "error", //錯誤提示框的類名,用于自定義樣式 errorInputClass: "invalid", //input無效的類名,用于自定義樣式 }, submit); function submit(){ console.log("表單驗證成功,準(zhǔn)備提交"); //提交操作 }
執(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使用正則表達(dá)式,其錯誤提示信息放在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 //標(biāo)志位,說明是異步的檢驗 }; 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(jìn)兩個參數(shù),如果檢驗失敗則執(zhí)行第一個參數(shù),成功則執(zhí)行第二個參數(shù),為插件所用。
4. 添加自定義類型出錯提示
Form已經(jīng)提供了一套默認(rèn)類型出錯提示:
Form.prototype.validationMessage_cn = { email: '無效的郵箱格式', number: '無效的數(shù)字格式', url: '無效的網(wǎng)址格式', password: '格式無效', text: '格式無效' };
你也可以自定義一個,將上面的文案換掉即可,暫時沒有提供參數(shù)
另外可以取消掉瀏覽器提供的文案,用上面的默認(rèn)文案
//如果瀏覽器的語言不是中文的話,就不要使用英文的文案了,雙語站時候適用 checkOpt.disableBrowserMsg = !(navigator.language || navigator.userLanguage).match(/cn/i)
還可以指定Form使用的語言:
//雙語站切換時適用 checkOpt.lang = "cn"; //或者en
三、插件源碼解析
插件的代碼并不是很復(fù)雜,只是需要考慮很多細(xì)節(jié)。
1. 為非html5瀏覽器添加checkValidity函數(shù)
如果沒有checkValidity函數(shù)的話就給它添加一個,核心代碼見Github,這里不進(jìn)行詳細(xì)說明。
var input = document.createElement("input"); if(!input.checkValidity){ HTMLInputElement.prototype.checkValidity = function(){ //詳細(xì)代碼見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)文章
微信小程序iBeacon測距及穩(wěn)定程序的實現(xiàn)解析
這篇文章主要介紹了微信小程序iBeacon測距及穩(wěn)定程序的實現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07JavaScript學(xué)習(xí)筆記之基于定時器實現(xiàn)圖片無縫滾動功能詳解
這篇文章主要介紹了JavaScript學(xué)習(xí)筆記之基于定時器實現(xiàn)圖片無縫滾動功能,結(jié)合實例形式分析了javascript定時器與頁面元素屬性動態(tài)設(shè)置等相關(guān)操作技巧,需要的朋友可以參考下2019-01-01JS+JSP通過img標(biāo)簽調(diào)用實現(xiàn)靜態(tài)頁面訪問次數(shù)統(tǒng)計的方法
這篇文章主要介紹了JS+JSP通過img標(biāo)簽調(diào)用實現(xiàn)靜態(tài)頁面訪問次數(shù)統(tǒng)計的方法,基于JavaScript動態(tài)調(diào)用jsp頁面通過對TXT文本文件的讀寫實現(xiàn)統(tǒng)計訪問次數(shù)的功能,需要的朋友可以參考下2015-12-12JavaScript擴(kuò)展運算符的學(xué)習(xí)及應(yīng)用詳情(ES6)
這篇文章主要介紹了JavaScript擴(kuò)展運算符的學(xué)習(xí)及應(yīng)用詳情(ES6),擴(kuò)展運算符是ES6新增的一種運算符,他可以幫助我們簡化代碼,簡化操作,具體相關(guān)知識感興趣的小伙伴可以查看下面文章的簡單介紹2022-08-08js動態(tài)添加input按鈕并給按鈕增加onclick的函數(shù)事件(帶參數(shù))完整實例
這篇文章主要介紹了js動態(tài)添加input按鈕并給按鈕增加onclick的函數(shù)事件,結(jié)合完整實例形式分析了javascript頁面元素屬性動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2023-07-07