|
by zhangxinxu from http://www. 一、前言前3篇文章實際都是為本文做鋪墊的,如果以下棋表示,前三篇是普通走棋,本篇是將軍! 目前市面上有不少表單驗證插件,看似強(qiáng)大,實在糟糕! 總結(jié)下,有以下一些問題:
當(dāng)JS出現(xiàn)錯誤的時候而無法正常運(yùn)作的時候,驗證就是聾子的耳朵——擺設(shè),即使在現(xiàn)代瀏覽器下也是如此。 面向未來的表單驗證
換言之,所謂面向未來的表單驗證,是遵循W3C HTML5規(guī)范的表單驗證,我們可以從目前領(lǐng)先的瀏覽器中看到大致雛形。而本文所有展示的html5Validate表單驗證插件,就是基于這個未來設(shè)計的。 二、html5Validate概述html5Validate插件的驗證機(jī)制、交互形式甚至形式與Chrome瀏覽器HTML5表單內(nèi)置驗證走的很近。在使用的時候,就是寫寫原生的HTML5表單代碼。我只想說:走陽光大道和過獨木橋的感覺是完全不一樣的。 舉個簡單例子,一個郵箱驗證,HTML5代碼表示應(yīng)該是下面這個樣子: <input type="email" required> 好巧的是,使用html5Validate進(jìn)行表單驗證的時候,也是使用上面這段HTML代碼! 類似下面的綁定: $("form").html5Validate();于是,您在提交表單的時候會(在各個瀏覽器下)看到這樣子的提示: 跟Chrome瀏覽器下的提示文字近似: html5Validate支持我所知的HTML5驗證相關(guān)的東西,如
為了滿足實際開發(fā)需求,額外增加了四個自定義屬性值: 支持自動的全角轉(zhuǎn)半角。
兼容性 三、demo、使用以及資源下載您可以狠狠地點擊這里:html5Validate表單驗證jQuery插件測試demo //zxx: 還有一些實際應(yīng)用的例子將會在本文后半部分展示。 使用
下載 zip源文件打包下載(含測試demo)(右鍵-[目標(biāo)|源文件]另存為):jquery-html5Validate.zip 更新時間: 四、可選參數(shù)以及詳解可選參數(shù)見下表:
1. 參數(shù)novalidate 如果沒有設(shè)計這個參數(shù)
這就是為什么測試demo在FireFox等瀏覽器下不出現(xiàn)內(nèi)置提示效果的原因。 可能您有這樣的需求,您希望除了IE10以外的現(xiàn)代瀏覽器都使用瀏覽器自帶的驗證規(guī)則以及提示效果,怎么辦,可以像下面這樣? var isIe10 = typeof document.msHidden !== "undefiend";
$("form").html5Validate($.noop, {
novalidate: isIe10? false: true
});2. 參數(shù)submitEnabled 很多時候,我們的表單是Ajax提交的,當(dāng)頁面加載不是很及時的時候——如表單元素呈現(xiàn),但驗證腳本未綁定——,用戶回車一個輸入框,悲劇來了,默認(rèn)表單的 我不清楚其他團(tuán)隊是怎么處理的,我處理這類問題是表單元素的提交按鈕默認(rèn)
例如,測試demo中,默認(rèn)按鈕是 等驗證事件初始化完畢,自然, 對于原生 3. 參數(shù)labelDrive 這是與瀏覽器內(nèi)置提示文字不一樣的地方,優(yōu)先label標(biāo)簽文字提示。什么意思?
//zxx: 對于單復(fù)選框以及按鈕,由于點擊它們對應(yīng)label標(biāo)簽會觸發(fā)選中或者按鈕事件,因此,對于這些元素,labelDrive參數(shù)是完全的醬油 – 提示文字與label毫無關(guān)系。對于下拉框而言,其在隱藏狀態(tài)下,提示文字可以從label獲?。环请[藏狀態(tài)也是醬油。 何為 <label for="email">郵箱:</label><input type="email" id="email" required> 上面HTML的提示文字就是: 如果對應(yīng)label標(biāo)簽中的文字是“郵箱/手機(jī)”,則提示文字是: 也就是說“ 該文字如何獲取? 小技巧 <label for="comment">內(nèi)容:</label><textarea id="comment" rows="5" required data-min="5" data-max="100"> 提示文字為“您尚未輸入評論內(nèi)容”,而不是“您尚未輸入評論”。 4. 參數(shù)validate 新增于2013-06-19 在我的實際項目中,MooTools版的 插件內(nèi)部是如此運(yùn)作的,先執(zhí)行插件內(nèi)置的驗證,然后,再執(zhí)行 言語蒼白,demo明了。您可以狠狠地點擊這里:html5Validate新增validate參數(shù)demo demo中有兩個額外的驗證:一是前后密碼需要一致;二是多選項至少選擇3個。大致截圖如下: 然后,相關(guān)JS如下: $("form").html5Validate(function() {
alert("驗證全部通過!");
this.submit();
}, {
validate: function() {
// 下面這些就是額外的一些特殊驗證
if ($("#pwdCheck").val() !== $("#pwd").val()) {
$("#pwdCheck").testRemind("前后密碼不一致");
return false;
} else if ($("input[type='checkbox']:checked").length < 3) {
$("#checkBox").testRemind("至少選擇3項");
return false;
}
return true;
}
});注意需要有Boolean類型返回值,驗證出錯返回
五、四個自定義屬性HTML5的表單驗證html5Validate自然支持,但是,僅僅HTML5的東西貌似不能完全支持實際的各類需求,因此,html5Validate中還有4個自定義屬性(就是前面提到的 1. 自定義屬性”data-key”和”data-target” 何為模擬表單?如自定義的下拉框,或者星星評分選擇等…… ① “data-key”作用 <label for="serverScore" class="dn">服務(wù)評分</label>
<input type="hidden" id="serverScore" required data-key="拖選" />于是,提示的時候,就是: 注意:隱藏性質(zhì)表單的 ① “data-target”作用 要知道,這些隱藏表單的位置是捕獲不到(
如果 HTML代碼如下: <span id="hiddenRemind" class="bar_bg"><i class="bar_btn" data-rel="envirScore"></i></span> <label for="envirScore" class="dn">環(huán)境評分</label> <input type="range" id="envirScore" class="dn" required data-key="拖選" data-target="hiddenRemind" /> 2. 自定義屬性”data-max”和”data-min” <textarea id="comment" rows="5" data-max="100" data-min="5" required></textarea> 表示,評論內(nèi)容需要5-100個字符。無論字符不足或者是超出,都會出現(xiàn)提示,其中,當(dāng)內(nèi)容超出的時候,html5Validate會自動幫你選中溢出部分的文字,例如下面截圖: 六、一些驗證類型的說明1. type=number, 整數(shù)與小數(shù) 具體驗證規(guī)則參見之前下的一步棋:HTML5 number類型文本框step屬性的驗證機(jī)制 數(shù)值文本框的UI 因此,實際上,不少團(tuán)隊的數(shù)值類型框還是老舊的 很簡單,在類型后面加個空格,例如,不是設(shè)置 html5Validate會自動過濾最后的空格,因此,相關(guān)的驗證沒有任何影響。 數(shù)值文本框與multiple 2. 不得不提的type=range 如果瀏覽器支持 因此,個人看來, 3. type=radio以及 type=checkbox的驗證規(guī)則 對于同一組單選框(name值一致),只要有一個單選框設(shè)置 對于復(fù)選框,哪個必選,就哪個需要設(shè)置 七、內(nèi)置插件testRemind介紹jquery-html5Validate.js中還內(nèi)置另外一個插件 – testRemind. 就是出現(xiàn)那個黃色提示框框的插件。 用法如下: $().testRemind(content, options); 其中, 可選參數(shù)
參數(shù)含義 ② 參數(shù)align 在html5Validate中,一般的表單元素尖角都是在中間的,但是,單選框和復(fù)選框尖角實在左側(cè),如下圖所示,這個設(shè)置目前暫不可變: ③ 參數(shù)css 例如,通過如下的設(shè)置,我們可以讓提示框框的效果長得跟Chrome瀏覽器近似: $("input").testRemind("無論輸入什么,都不合格!", {
size: 10,
css: {
padding: "8px 10px",
borderColor: "#aaa",
borderRadius: 8,
boxShadow: "2px 2px 4px rgba(0,0,0,.2)",
background: "#fff url(chrome-remind.png) no-repeat 10px 12px",
backgroundColor: "#fff",
fontSize: 16,
textIndent: 20
}
}).get(0).focus();
于是,有類似下面效果(截自FireFox 17): 您可以狠狠地點擊這里:testRemind Chrome UI測試demo 幾乎醬油的可選參數(shù) 一來自己不希望html5Validate與testRemind方法有過多的耦合,因為這會讓我覺得復(fù)雜,而產(chǎn)生不安;其次,對于一個項目而言,提示框框效果應(yīng)該是整站統(tǒng)一,樣式設(shè)置的限制未嘗不是一件好事。 不過,此處小標(biāo)題是“幾乎醬油”,言外之意就是您還是可以通過一定的外部設(shè)置,改變提示框框的樣式的。本插件JS中暴露了一個名為 舉個板栗,如下代碼: $.testRemind.css = {
borderColor: "#a0b3d6",
backgroundColor: "#f0f3f9"
};
$("#testForm").html5Validate();則,提示框框就會變成下面這幅屌模樣: 總結(jié)為:testRemind方法的CSS有限可選參數(shù) 注意:提示框出現(xiàn)后,點擊提示框以外的頁面任意位置,或在表單元素foxus狀態(tài)下觸發(fā)鍵盤,或改變?yōu)g覽器的尺寸,提示框都會 $.testRemind.display //zxx: 下面為廣告~~注意不要勿點~~嘻嘻~~ 八、高階使用
html5Validate中有個名為$.html5Validate的對象,其中有一些方法,如驗證元素是否為空( $.html5Validate.isAllpass(elements, options); 顧名思意:HTML5驗證 – 是否全部通過! 1. 參數(shù)elements $.html5Validate.isAllpass(document.getElementsByTagName("form")[0]);
$.html5Validate.isAllpass($("form"));
$.html5Validate.isAllpass($("input, textarea, select"));2. 可選參數(shù)options
訂閱優(yōu)惠信息 <input type="email " class="email" placeholder="輸入郵箱,如a@b.com" required /> <a href="javascript:" class="button">訂閱</a> 然后,類似下面的驗證處理: $(".button").bind("click", function() {
var email = $(".email");
if ($.html5Validate.isAllpass(email)) {
// 郵箱驗證通過,該干嘛干嘛~~
}
});您可以狠狠地點擊這里:$.html5Validate.isAllpass簡單應(yīng)用demo
九、其他可用的全局方法、對象及擴(kuò)展1. 全半角轉(zhuǎn)換DBC2SBC方法 DBC2SBC("13208033621"); // 結(jié)果是"13208033621"2. 檢測元素是否可見 這里的不可見指的是不能被focus的隱藏,包括 3. Boolean型屬性檢測 所謂Boolean型屬性指的是HTML5中 4. 全局對象OBJREG及擴(kuò)展 此對象就是根據(jù)表單 OBJREG.DATE = "^[1|2]\\d{3}\\-[0|1]?\\d\\-[0-3]?\\d$"于是乎,當(dāng)提交表單含 您還可以自定義HTML5規(guī)范以外的 類似的,您網(wǎng)站的昵稱等也可以自定義,例如 昵稱
<input type="nickname" class="nickname" required data-min="6" data-max="20" /> 6-20個單詞字符
<a href="javascript:" class="button">檢測</a>JS部分的設(shè)置: OBJREG.NICKNAME = "^\\w+$";
OBJREG["prompt"].nickname = "只能是字母數(shù)字以及下劃線";
$(".button").bind("click", function() {
var nickname = $(".nickname");
if ($.html5Validate.isAllpass(nickname)) {
alert("驗證通過!");
}
});于是乎,當(dāng)含非單詞字符的時候,就會有下圖所示提示: 您可以狠狠地點擊這里:html5Validate全局對象OBJREG擴(kuò)展demo OBJREG對象與pattern屬性之間關(guān)系 舉個例子,有些情況下,數(shù)值輸入框可以允許輸入中文單位,您就可以這樣處理: <input type="number" pattern="^\d+" />這樣子,插件會使用 注意: 十、各類實際應(yīng)用1. 注冊及其驗證 這個demo在demo里面算是蠻仿真的,驗證碼以及驗證什么的都是有處理的。 值得說明的 其中,使用了前面提到的 ② 確認(rèn)密碼框禁用與不禁用的控制部分有這么一行代碼: if ($.html5Validate.isEmpty(this)) {
③ html5Validate插件并沒有密碼或手機(jī)號碼前后一致驗證的方法,如果在實際使用中遇到這類需求,您可以在html5Validate驗證回調(diào)中進(jìn)行額外驗證。 2. 發(fā)表點評及驗證
這個demo的重點就在星星的處理上。 星星的本質(zhì)是單選框組,從差到好共5個單選,默認(rèn)是顯示的,當(dāng)JS執(zhí)行到此的時候,單選框組隱藏,默認(rèn)隱藏的星星們顯示;這個交互就是我上面提到的模擬表單! 單選框組的驗證只有”是否必選”這1條,如果必選,則僅僅1個單選 該單選框HTML代碼如下: <input type="radio" id="radioImp1" name="impress" value="1" required data-target="starScore"><label for="radioImp1">差</label> 然后通過: $().css("visibility", "hidden");將其隱藏不可見,打通任督二脈,以便 點擊星星的操作實際是讓對應(yīng)單選框選中,從這點來看,我們還可以把星星使用 其他都是些常規(guī)驗證,沒有什么好說的。 十一、結(jié)語以及其他雜碎IE10向下兼容模式的IE6-IE9, 其HTML5表單屬性又有嚴(yán)重的沖突bug(外表看不出來). 因此,本插件在這些瀏覽器下有部分的不支持,主要是IE10支持的HTML5 我個人的建議是忽略之,理由略……如果您實在想支持, 本插件驗證機(jī)制多遵循Chrome瀏覽器,因此,其表單驗證都是一個一個提示的,大范圍標(biāo)紅這種需求本插件滿足不了。 補(bǔ)充:關(guān)于即時驗證 雖然插件支持即時驗證無望,但是,插件之外是可以簡單幾行代碼支持的,如下: $.fn.immediValidate = function(passCallback) {
return $(this).find(":input").each(function() {
if (/^submit|image|reset|file|radio|checkbox|button$/.test(this.type)) return;
var self = this;
$(this).bind("blur", function() {
setTimeout(function() {
if ($.testRemind.display == false && $.html5Validate.isAllpass($(self)) ) {
$.isFunction(passCallback) && passCallback.call(self);
}
}, 100);
});
});
};于是,我們只要這樣綁定JS就可以了: $("form").html5Validate().immediValidate();本地已驗證。 雖然html5Validate插件的完成細(xì)嚼慢咽,多番積累,但是,不可能面面俱到,因此,如果承蒙您使用了,并且發(fā)現(xiàn)了相關(guān)問題,歡迎提出來。我會盡快修改并發(fā)布的。因為github自己還玩得不熟,版本啊更新什么的都是比較傳統(tǒng)的手動方式,所以可能會有JS是最新的,但是文中的更新日期還是落后的情況,希望見諒。 也歡迎提出其他寶貴意見,不甚感謝! 原創(chuàng)文章,轉(zhuǎn)載請注明來自張鑫旭-鑫空間-鑫生活[http://www.] (本篇完) 如果您覺得本文的內(nèi)容對您的學(xué)習(xí)有所幫助: 相關(guān)文章
標(biāo)簽: HTML5, html5Validate, jQuery, 插件, 表單, 驗證
|
|
|