使用 jQuery 實(shí)現(xiàn)表單驗(yàn)證功能
5.1.5 表單驗(yàn)證
表單作為 HTML 最重要的一個(gè)組成部分,幾乎在每個(gè)網(wǎng)頁(yè)上都有體現(xiàn),例如用戶提交信息、用戶反饋信息和用戶查詢信息等,因此它是網(wǎng)站管理者與瀏覽者之間溝通的橋梁。在表單中,表單驗(yàn)證的作用也是非常重要的,它能使表單更加靈活、美觀和豐富。
以一個(gè)簡(jiǎn)單的用戶注冊(cè)為例。首先新建一個(gè)表單, HTML 代碼如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>jQueryStudy</title>
<style type="text/css">
.int{ height: 30px; text-align: left; width: 600px; }
label{ width: 200px; margin-left: 20px; }
.high{ color: red; }
.msg{ font-size: 13px; }
.onError{ color: red; }
.onSuccess{ color: green; }
</style>
<script type="text/javascript" src="jquery-1.10.2.js"></script>
</head>
<body>
<form method="post" action="">
<div class="int">
<label for="name">名稱:</label>
<input type="text" id="name" class="required" />
</div>
<div class="int">
<label for="email">郵箱:</label>
<input type="text" id="email" class="required" />
</div>
<div class="int">
<label for="address">地址:</label>
<input type="text" id="personinfo" />
</div>
<div class="int">
<input type="submit" value="提交" id="send" style="margin-left: 70px;" />
<input type="reset" value="重置" id="res" />
</div>
</form>
<script type="text/javascript"></script>
</body>
</html>
顯示效果如圖 1 所示。

圖 1 表單初始化
在表單內(nèi) class 屬性為 “required” 的文本框是必須填寫的,因此需要將它與其他的非必須填寫的表單元素加以區(qū)別,即在文本框后面追加一個(gè)紅色的星號(hào)標(biāo)識(shí)??梢允褂?append() 方法來完成,代碼如下:
<script type="text/javascript">
//為表單的必填文本框添加提示信息(選擇form中的所有后代input元素)
$("form :input.required").each(function () {
//創(chuàng)建元素
var $required = $("<strong class='high'>*</strong>");
//將它追加到文檔中
$(this).parent().append($required);
});
</script>
顯示效果如圖 2 所示。

圖 2 用小紅星標(biāo)識(shí)
用戶在“名稱”文本框中填寫完信息后,將光標(biāo)的焦點(diǎn)從“名稱”文本框中移出時(shí),需要即時(shí)判斷名稱是否符合驗(yàn)證規(guī)則。當(dāng)光標(biāo)的焦點(diǎn)從“郵箱”文本框移出時(shí),也需要即時(shí)判斷“郵箱”填寫是否正確,因此需要給表單元素添加失去焦點(diǎn)事件,即 blur 事件。 jQuery 代碼如下:
<script type="text/javascript">
//為表單的元素添加失去焦點(diǎn)事件
$("form :input").blur(function () {
// ...省略代碼
});
</script>
驗(yàn)證表單元素步驟如下。
(1)判斷當(dāng)前失去焦點(diǎn)的元素是“名稱”還是“郵箱”,然后分別處理。
(2)如果是“名稱”,判斷元素的值的長(zhǎng)度是否小于 6 ,如果小于 6 ,則用紅色字體提醒用戶輸入不正確,反之,則用綠色提醒用戶輸入正確。
(3)如果是“郵箱”,判斷元素的值是否符合郵箱的格式,如果不符合,則用紅色字體提醒用戶輸入不正確,反之,則用綠色字體提醒用戶輸入正確。
(4)將提醒信息追加到當(dāng)前的父元素的最后。
【注】:為了使用方便,當(dāng) text 文本框中的內(nèi)容格式錯(cuò)誤時(shí),程序應(yīng)盡量把所有提示都顯示出來,而不是每次驗(yàn)證一種格式后只與之相關(guān)的錯(cuò)誤提醒信息。
根據(jù)以上分析,可以寫出如下 jQuery 代碼:
<script type="text/javascript">
//為表單的必填文本框添加提示信息(選擇form中的所有后代input元素)
$("form :input.required").each(function () {
//創(chuàng)建元素
var $required = $("<strong class='high'>*</strong>");
//將它追加到文檔中
$(this).parent().append($required);
});
//為表單元素添加失去焦點(diǎn)事件
$("form :input").blur(function(){
var $parent = $(this).parent();
//驗(yàn)證名稱
if($(this).is("#name")){
if($.trim(this.value) == "" || $.trim(this.value).length < 6){
var errorMsg = " 請(qǐng)輸入至少6位的名稱!";
//class='msg onError' 中間的空格是層疊樣式的格式
$parent.append("<span class='msg onError'>" + errorMsg + "</span>");
}
else{
var okMsg=" 輸入正確";
$parent.find(".high").remove();
$parent.append("<span class='msg onSuccess'>" + okMsg + "</span>");
}
}
//驗(yàn)證郵箱
if($(this).is("#email")){
if($.trim(this.value) == "" || ($.trim(this.value) != "" && !/.+@.+\.[a-zA-Z]{2,4}$/.test($.trim(this.value)))){
var errorMsg = " 請(qǐng)輸入正確的E-Mail地址!";
$parent.append("<span class='msg onError'>" + errorMsg + "</span>");
}
else{
var okMsg=" 輸入正確";
$parent.find(".high").remove();
$parent.append("<span class='msg onSuccess'>" + okMsg + "</span>");
}
}
});
</script>
當(dāng)連續(xù)幾次輸入錯(cuò)誤的格式后,會(huì)出現(xiàn)如圖 3 所示的效果

圖 3 操作多次的提示效果
由于每次在元素失去焦點(diǎn)后,都會(huì)創(chuàng)建一個(gè)新的提醒元素,然后將它追加到文檔中,最后就出現(xiàn)了多次的提醒信息。因此,需要在創(chuàng)建提醒元素之前,將當(dāng)前元素以前的提醒元素都刪除。可以使用 remove() 方法來完成,代碼如下:
//為表單元素添加失去焦點(diǎn)事件
$("form :input").blur(function(){
var $parent = $(this).parent();
$parent.find(".msg").remove(); //刪除以前的提醒元素
// ...省略代碼
});
顯示效果如圖 4 所示。

圖 4 正確的效果
當(dāng)鼠標(biāo)在表單元素中多次失去焦點(diǎn)時(shí),都可以提醒用戶填寫是否正確。但是,如果用戶無視錯(cuò)誤提醒,執(zhí)意要單擊“提交”按鈕時(shí),為了使表單填寫準(zhǔn)確,在表單提交之前,需要對(duì)表單的必須填寫元素進(jìn)行一次整體的驗(yàn)證??梢灾苯佑?trigger() 方法來觸發(fā)blur事件,從而達(dá)到驗(yàn)證效果。如果填寫錯(cuò)誤,就會(huì)以紅色提醒用戶;如果名稱和郵箱都不符合規(guī)則,那么就有兩處錯(cuò)誤,即有兩個(gè) class 為 “onError” 的元素,因此可以根據(jù) class 為 “onError” 元素的長(zhǎng)度來判斷是否可以提交。如果長(zhǎng)度為 0 ,即 true ,說明已經(jīng)可以提交了;如果長(zhǎng)度大于0,即 false ,說明有錯(cuò)誤,需要阻止表單提交。阻止表單提交可以直接用 “return false” 語(yǔ)句。
根據(jù)上面的分析,可以在提交事件中寫出如下jQuery代碼:
//點(diǎn)擊重置按鈕時(shí),觸發(fā)文本框的失去焦點(diǎn)事件
$("#send").click(function(){
//trigger 事件執(zhí)行完后,瀏覽器會(huì)為submit按鈕獲得焦點(diǎn)
$("form .required:input").trigger("blur");
var numError = $("form .onError").length;
if(numError){
return false;
}
alert("注冊(cè)成功,密碼已發(fā)到你的郵箱");
});
顯示效果如圖 5 所示。

圖 5 正確提交
用戶也許會(huì)提出:為什么每次都要等字段元素失去焦點(diǎn)后,才提醒是否正確?如果輸入時(shí)就可以提醒,這樣就可以更加即時(shí)了。
為了達(dá)到用戶提出的需求,需要給表單元素綁定 keyup 事件和 focus 事件,keyup 事件能在用戶每次松開按鍵時(shí)觸發(fā),實(shí)現(xiàn)即時(shí)提醒;focus 事件能在元素得到焦點(diǎn)的時(shí)候觸發(fā),也可以實(shí)現(xiàn)即時(shí)提醒。
代碼如下:
$("form :input").blur(function(){
//失去焦點(diǎn)處理函數(shù)
//代碼省略...
}).keyup(function(){
//triggerHandler 防止事件執(zhí)行完后,瀏覽器自動(dòng)為標(biāo)簽獲得焦點(diǎn)
$(this).triggerHandler("blur");
}).focus(function(){
$(this).triggerHandler("blur");
});
這樣當(dāng)用戶將光標(biāo)定位到文本框上和改變文本框的值時(shí),表單就會(huì)即時(shí)提醒用戶填寫是否正確,從而符合了用戶的需求。
在前面的章節(jié)已經(jīng)提過,trigger(“blur”)不僅會(huì)觸發(fā)為元素綁定的blur事件,也會(huì)觸發(fā)瀏覽器默認(rèn)的 blur 事件,即不能講光標(biāo)定位到文本框上。而 triggerHandler(“blur”)只會(huì)觸發(fā)為元素綁定的 blur 事件,而不觸發(fā)瀏覽器默認(rèn)的 blur 事件。
至此,表單驗(yàn)證過程就全部完成。讀者可以根據(jù)自己的實(shí)際需求修改驗(yàn)證規(guī)則。
【注】:客戶端的驗(yàn)證僅用于提升用戶的操作體驗(yàn),而服務(wù)器仍需對(duì)用戶輸入的數(shù)據(jù)的合法性進(jìn)行校驗(yàn)。對(duì)于禁用了腳本的用戶和用戶自制的網(wǎng)頁(yè)提交操作,必須在服務(wù)器端驗(yàn)證。
完整代碼:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>jQueryStudy</title>
<style type="text/css">
.int{ height: 30px; text-align: left; width: 600px; }
label{ width: 200px; margin-left: 20px; }
.high{ color: red; }
.msg{ font-size: 13px; }
.onError{ color: red; }
.onSuccess{ color: green; }
</style>
<script type="text/javascript" src="jquery-1.10.2.js"></script>
</head>
<body>
<form method="post" action="">
<div class="int">
<label for="name">名稱:</label>
<input type="text" id="name" class="required" />
</div>
<div class="int">
<label for="email">郵箱:</label>
<input type="text" id="email" class="required" />
</div>
<div class="int">
<label for="address">地址:</label>
<input type="text" id="personinfo" />
</div>
<div class="int">
<input type="submit" value="提交" id="send" style="margin-left: 70px;" />
<input type="reset" value="重置" id="res" />
</div>
</form>
<script type="text/javascript">
$(document).ready(function(){
//為表單的必填文本框添加提示信息(選擇form中的所有后代input元素)
$("form :input.required").each(function(){
//創(chuàng)建元素
var $required = $("<strong class='high'>*</strong>");
//將它追加到文檔中
$(this).parent().append($required);
});
//為表單的必填文本框添加相關(guān)事件(blur、focus、keyup)
$("form :input").blur(function(){
//注意:這里的this是DOM對(duì)象,$(this)才是jQuery對(duì)象
var $parent = $(this).parent();
//刪除之前的錯(cuò)誤提醒信息
$parent.find(".msg").remove();
//驗(yàn)證“名稱”
if($(this).is("#name")){
//運(yùn)用jQuery中的$.trim()方法,去掉首位空格
if($.trim(this.value) == "" || $.trim(this.value).length < 6){
var errorMsg = " 請(qǐng)輸入至少6位的名稱!";
//class='msg onError' 中間的空格是層疊樣式的格式
$parent.append("<span class='msg onError'>" + errorMsg + "</span>");
}
else{
var okMsg=" 輸入正確";
$parent.find(".high").remove();
$parent.append("<span class='msg onSuccess'>" + okMsg + "</span>");
}
}
//驗(yàn)證郵箱
if($(this).is("#email")){
if($.trim(this.value) == "" || ($.trim(this.value) != "" && !/.+@.+\.[a-zA-Z]{2,4}$/.test($.trim(this.value)))){
var errorMsg = "請(qǐng)輸入正確的E-Mail地址!";
$parent.append("<span class='msg onError'>" + errorMsg + "</span>");
}
else{
var okMsg=" 輸入正確";
$parent.find(".high").remove();
$parent.append("<span class='msg onSuccess'>" + okMsg + "</span>");
}
}
}).keyup(function(){
//triggerHandler 防止事件執(zhí)行完后,瀏覽器自動(dòng)為標(biāo)簽獲得焦點(diǎn)
$(this).triggerHandler("blur");
}).focus(function(){
$(this).triggerHandler("blur");
});
//點(diǎn)擊重置按鈕時(shí),觸發(fā)文本框的失去焦點(diǎn)事件
$("#send").click(function(){
//trigger 事件執(zhí)行完后,瀏覽器會(huì)為submit按鈕獲得焦點(diǎn)
$("form .required:input").trigger("blur");
var numError = $("form .onError").length;
if(numError){
return false;
}
alert("注冊(cè)成功,密碼已發(fā)到你的郵箱");
});
});
</script>
</body>
</html>
jQuery 官方 API: http://api.jquery.com/
以上所述是小編給大家介紹的使用 jQuery 實(shí)現(xiàn)表單驗(yàn)證功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- jquery validate.js表單驗(yàn)證的基本用法入門
- 基于Bootstrap+jQuery.validate實(shí)現(xiàn)Form表單驗(yàn)證
- jquery表單驗(yàn)證使用插件formValidator
- Jquery練習(xí)之表單驗(yàn)證實(shí)現(xiàn)代碼
- 基于Jquery實(shí)現(xiàn)表單驗(yàn)證
- jQuery 表單驗(yàn)證插件formValidation實(shí)現(xiàn)個(gè)性化錯(cuò)誤提示
- jquery實(shí)現(xiàn)表單驗(yàn)證并阻止非法提交
- jQuery實(shí)現(xiàn)用戶注冊(cè)的表單驗(yàn)證示例
- Jquery插件easyUi表單驗(yàn)證提交(示例代碼)
- jQuery實(shí)現(xiàn)表單驗(yàn)證功能
相關(guān)文章
jQuery實(shí)現(xiàn)側(cè)邊欄隱藏與顯示的方法詳解
這篇文章主要介紹了jQuery實(shí)現(xiàn)側(cè)邊欄隱藏與顯示的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了jQuery基于事件響應(yīng)與頁(yè)面元素屬性動(dòng)態(tài)操作實(shí)現(xiàn)元素顯示與隱藏功能的相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
jquery對(duì)象和DOM對(duì)象的相互轉(zhuǎn)換詳解
這篇文章主要介紹了jquery對(duì)象和DOM對(duì)象的相互轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下2016-10-10
通過Ajax使用FormData對(duì)象無刷新上傳文件方法
這篇文章主要介紹了通過Ajax使用FormData對(duì)象無刷新上傳文件方法,具有一定的參考價(jià)值,感興趣的朋友可以了解一下。2016-12-12
使用jquery模擬a標(biāo)簽的click事件無法實(shí)現(xiàn)跳轉(zhuǎn)的解決
這篇文章主要給大家介紹了關(guān)于使用jquery模擬a標(biāo)簽的click事件無法實(shí)現(xiàn)跳轉(zhuǎn)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
基于jQuery實(shí)現(xiàn)復(fù)選框是否選中進(jìn)行答題提示
近期有項(xiàng)目需求是這樣的,需要根據(jù)用戶選擇的選項(xiàng)給出相應(yīng)的提示,本文給大家介紹基于jQuery實(shí)現(xiàn)復(fù)選框是否選中進(jìn)行答題提示,對(duì)jquery復(fù)選框是否選中相關(guān)知識(shí)感興趣的朋友一起看看吧2015-12-12
jQuery中(function($){})(jQuery)詳解
本文通過具體示例向大家詳細(xì)介紹了jQuery中的(function($){})(jQuery)的用法和意義,對(duì)此有相同困惑的小伙伴可以參考下本文。2015-07-07

