jQuery 表單驗(yàn)證擴(kuò)展(三)
(一). 輸入范圍驗(yàn)證存在問(wèn)題
在第二篇上提到的問(wèn)題,在原有的驗(yàn)證中也存在相同的問(wèn)題。當(dāng)然在這次改寫(xiě)中也解決了一些這些問(wèn)題。同時(shí)也添加了對(duì)radio,checkbox,select 元素的驗(yàn)證。當(dāng)然對(duì)于時(shí)間的驗(yàn)證仍沒(méi)有解決,后續(xù)過(guò)程中會(huì)繼續(xù)補(bǔ)充!
(二). 驗(yàn)證參數(shù)的設(shè)計(jì)
onEmptyText: 當(dāng)輸入內(nèi)容為空的時(shí)候顯示文本
onEmptyClass: 當(dāng)輸入內(nèi)容為空的時(shí)候顯示樣式
onSuccessText: 當(dāng)驗(yàn)證成功的時(shí)候顯示的文本
onSuccessClass: 當(dāng)驗(yàn)證成功的時(shí)候顯示的樣式
onErrorText:當(dāng)驗(yàn)證失敗的時(shí)候顯示的文本
onErrorClass:當(dāng)驗(yàn)證失敗的時(shí)候顯示的樣式
onFocusText: 當(dāng)獲得焦點(diǎn)的時(shí)候顯示的文本
onFocusClass:當(dāng)獲得焦點(diǎn)的時(shí)候顯示的樣式
dataType:輸入的數(shù)據(jù)類(lèi)型
min:輸入的最小值
max:輸入的最大值
targetId:顯示提示消息的元素id
改寫(xiě)的部分就是將提示性文字和樣式都單獨(dú)隔離出來(lái),可以更好靈活的操作表單驗(yàn)證!
改寫(xiě)的文章支持text,number,date 三種 數(shù)據(jù)形式,而且在radio,checkbox,select的驗(yàn)證也有更新。
radio,checkbox ,select 驗(yàn)證只是驗(yàn)證是否選中,而且這里的select 對(duì)于blur 事件并不敏感,所以這里采用的change事件來(lái)驗(yàn)證比較好。
(三). 驗(yàn)證范圍源碼解析
jQuery檢查輸入項(xiàng)的范圍 源碼解析
/**
* onEmptyText: 當(dāng)輸入內(nèi)容為空的時(shí)候顯示文本
* onEmptyClass: 當(dāng)輸入內(nèi)容為空的時(shí)候顯示樣式
* onSuccessText: 當(dāng)驗(yàn)證成功的時(shí)候顯示的文本
* onSuccessClass: 當(dāng)驗(yàn)證成功的時(shí)候顯示的樣式
* onErrorText:當(dāng)驗(yàn)證失敗的時(shí)候顯示的文本
* onErrorClass:當(dāng)驗(yàn)證失敗的時(shí)候顯示的樣式
* onFocusText: 當(dāng)獲得焦點(diǎn)的時(shí)候顯示的文本
* onFocusClass:當(dāng)獲得焦點(diǎn)的時(shí)候顯示的樣式
* dataType:輸入的數(shù)據(jù)類(lèi)型
* min:輸入的最小值
* max:輸入的最大值
* targetId:顯示提示消息的元素id
* @param {Object} inputArg
*/
$.fn.extend({
checkRange:function(inputArg){
//綁定焦點(diǎn)事件
$(this).bind("focus",function(){
var flag=true;
if($(this).is("input") || $(this).is("textarea")){
if($(this).attr("type")=="radio" || $(this).attr("type")=="checkbox"){
var name=$(this).attr("name");
var items=$('input[@name=""+name+""][checked]');
if(items.length>0){
flag=false;
}
}else{
if($(this).val()!=undefined && $(this).val()!=""){
flag=false;
}
}
}else{ //select 需要改進(jìn) select沒(méi)有focus事件,應(yīng)該改為change事件
}
if (flag) {
//顯示獲得焦點(diǎn)文本
addText(inputArg.targetId, inputArg.onFocusText);
//切換樣式
addClass(inputArg.targetId, inputArg.onFocusClass);
}
});
//綁定失去焦點(diǎn)事件
$(this).bind("blur",function(){
var flag=false;
if($(this).is("input") || $(this).is("textarea")){
if($(this).attr("type")=="radio" || $(this).attr("type")=="checkbox"){
var name=$(this).attr("name");
var items=$('input[@name=""+name+""][checked]');
if(items!=undefined && items.length>=inputArg.min && items.length<inputArg.max){
flag=true;
}
}else{
var value=$(this).val();
if (value == undefined || value == "") {
//顯示獲得焦點(diǎn)文本
addText(inputArg.targetId,inputArg.onEmptyText);
//切換樣式
addClass(inputArg.targetId,inputArg.onEmptyClass);
}else {
switch (inputArg.dataType) {
case "text":
if(value.length < inputArg.min || value.length >= inputArg.max){
flag=false;
}else{
flag=true;
}
break;
case "number":
if (isNaN(value)) {
flag = false;
}
else {
if (value < inputArg.min || value >= inputArg.max) {
flag = false;
}
else {
flag = true;
}
}
break;
case "date":
break;
}
}
}
}else{ //select
}
if(flag){
//顯示獲得焦點(diǎn)文本
addText(inputArg.targetId, inputArg.onSuccessText);
//切換樣式
addClass(inputArg.targetId, inputArg.onSuccessClass);
}else{
//顯示獲得焦點(diǎn)文本
addText(inputArg.targetId, inputArg.onErrorText);
//切換樣式
addClass(inputArg.targetId, inputArg.onErrorClass);
}
});
//select 選擇框選擇事件
if ($(this).is("select")) {
$(this).bind("change", function(){
var items=$(this).find("option:selected");
if(items!=undefined && items.length>=inputArg.min && items.length<inputArg.max){
//顯示獲得焦點(diǎn)文本
addText(inputArg.targetId, inputArg.onSuccessText);
//切換樣式
addClass(inputArg.targetId, inputArg.onSuccessClass);
}else{
//顯示獲得焦點(diǎn)文本
addText(inputArg.targetId, inputArg.onErrorText);
//切換樣式
addClass(inputArg.targetId, inputArg.onErrorClass);
}
});
}
}
});
這里比較重要的是對(duì)于select元素的驗(yàn)證,select可以選擇多個(gè)選中項(xiàng)。radio,checkbox,select 只是驗(yàn)證選擇長(zhǎng)度,而不會(huì)驗(yàn)證text,date 。這是本文很重要的一部分。源碼中也做了代碼重構(gòu),有很多共同部分都提取出來(lái),大大減少了代碼量,同時(shí)也利用了jQuery表單驗(yàn)證擴(kuò)展(二) 中的部分方法。
(四). 提取的共同代碼解析
第二篇中的公用方法
/**
* 根據(jù)輸入框的不同類(lèi)型來(lái)判斷
* @param {Object} flag
* @param {Object} inputArg
*/
function addMessage(flag,inputArg){
if(flag){
//顯示正確信息文本
addText(inputArg.targetId,inputArg.onSuccessText);
//切換樣式
addClass(inputArg.targetId,inputArg.onSuccessClass);
}else{
//顯示錯(cuò)誤信息文本
addText(inputArg.targetId,inputArg.onErrorText);
//切換樣式
addClass(inputArg.targetId,inputArg.onErrorClass);
}
}
/**
* 給目標(biāo)控件添加顯示的文本信息
* @param {Object} targetId 目標(biāo)控件id
* @param {Object} text 需要顯示的文本信息
*/
function addText(targetId,text){
if(text==undefined){
text="";
}
$("#"+targetId).html(" "+text);
}
/**
* 切換樣式
* @param {Object} targetId 目標(biāo)控件id
* @param {Object} className 顯示的樣式名稱(chēng)
*/
function addClass(targetId,className){
if(className!=undefined && className!=""){
$("#"+targetId).removeClass();
$("#"+targetId).addClass(className);
}
}
這段代碼主要主要用于添加文本提示和樣式問(wèn)題。
對(duì)于select元素的驗(yàn)證代碼
//select 選擇框選擇事件
if ($(this).is("select")) {
$(this).bind("change", function(){
var items=$(this).find("option:selected");
if(items!=undefined && items.length>=inputArg.min && items.length<inputArg.max){
//顯示獲得焦點(diǎn)文本
addText(inputArg.targetId, inputArg.onSuccessText);
//切換樣式
addClass(inputArg.targetId, inputArg.onSuccessClass);
}else{
//顯示獲得焦點(diǎn)文本
addText(inputArg.targetId, inputArg.onErrorText);
//切換樣式
addClass(inputArg.targetId, inputArg.onErrorClass);
}
});
}
這段代碼用于驗(yàn)證select選擇框元素,支持多項(xiàng)選擇驗(yàn)證。
(五). 驗(yàn)證使用例子
文本框輸入驗(yàn)證
當(dāng)輸入的內(nèi)容長(zhǎng)度不符
輸入的字符串滿(mǎn)足當(dāng)前要求提示
當(dāng)不輸入文本的時(shí)候驗(yàn)證
對(duì)于數(shù)字的驗(yàn)證
獲得焦點(diǎn)提示問(wèn)題
輸入的數(shù)字不滿(mǎn)足范圍
驗(yàn)證成功
對(duì)于checkbox的驗(yàn)證
checkbox組其中之一獲得焦點(diǎn)
選擇滿(mǎn)足數(shù)據(jù)
選擇超過(guò)數(shù)量
對(duì)于select 多項(xiàng)選擇
選擇數(shù)量過(guò)多
驗(yàn)證成功
(六). 驗(yàn)證測(cè)試代碼
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Untitled Document</title>
<link type="text/css" rel="stylesheet" href="new_file.css"/>
<script language="JavaScript" src="jquery-1.3.2.min.js" type="text/javascript"></script>
<script language="JavaScript" src="jquery-extend-1.0.0.js" type="text/javascript"></script>
<script language="JavaScript" type="text/javascript">
$(document).ready(function(){
$("#txtName").checkRange({
onFocusText:"必填項(xiàng)",
onFocusClass:"notice",
targetId:"txtNameTip",
onSuccessText:"驗(yàn)證成功",
onSuccessClass:"correct",
onErrorText:"你真不聽(tīng)話(huà),請(qǐng)認(rèn)真填寫(xiě)",
onErrorClass:"error",
min:6,
max:12,
dataType:"text"
});
$("#rdbMan,#rdbWoman").checkRange({
onFocusText:"必填項(xiàng)",
onFocusClass:"notice",
targetId:"txtSexTip"
});
$("#txtPass2").checkRange({
onFocusText:"必填項(xiàng)",
onFocusClass:"notice",
targetId:"txtPass2Tip",
onSuccessText:"驗(yàn)證成功",
onSuccessClass:"correct",
onErrorText:"你真不聽(tīng)話(huà),請(qǐng)認(rèn)真填寫(xiě)",
onErrorClass:"error",
min:10,
max:60,
dataType:"text"
});
$("#rdbMan1,#rdbWoman2,,#rdbMan3,,#rdbWoman4").checkRange({
onFocusText:"必填項(xiàng)",
onFocusClass:"notice",
targetId:"txthobbyTip",
onSuccessText:"驗(yàn)證成功",
onSuccessClass:"correct",
onErrorText:"你真不聽(tīng)話(huà),請(qǐng)認(rèn)真填寫(xiě)",
onErrorClass:"error",
min:1,
max:3,
dataType:"text"
});
$("#txtAge").checkRange({
onFocusText:"必填項(xiàng)",
onFocusClass:"notice",
targetId:"txtAgeTip",
onSuccessText:"驗(yàn)證成功",
onSuccessClass:"correct",
onErrorText:"輸入的范圍為10-60",
onErrorClass:"error",
min:10,
max:60,
dataType:"number"
});
$("#ddlOption").checkRange({
onFocusText:"必填項(xiàng)",
onFocusClass:"notice",
targetId:"ddlOptionTip",
onSuccessText:"驗(yàn)證成功",
onSuccessClass:"correct",
onErrorText:"你真不聽(tīng)話(huà),請(qǐng)認(rèn)真填寫(xiě)",
onErrorClass:"error",
min:1,
max:2,
dataType:"number"
});
$("#rdbMan,#rdbWoman").checkRange({
onFocusText:"必填項(xiàng)",
onFocusClass:"notice",
targetId:"txtSexTip",
onSuccessText:"驗(yàn)證成功",
onSuccessClass:"correct",
onErrorText:"你真不聽(tīng)話(huà),請(qǐng)認(rèn)真填寫(xiě)",
onErrorClass:"error",
min:1,
max:2,
dataType:"number"
});
});
</script>
</head>
<body>
<p>
<label>姓名:</label><input type="text" id="txtName" value=""/><span id="txtNameTip"></span>
</p>
<p>
<label>年齡:</label><input type="text" id="txtAge" value=""/><span id="txtAgeTip"></span>
</p>
<p>
<label>描述:</label><textarea id="txtArea"></textarea><span id="txtAreaTip"></span>
</p>
<p>
<label>密碼1:</label><textarea id="txtPass1"></textarea><span id="txtPass1Tip"></span>
</p>
<p>
<label>密碼2:</label><textarea id="txtPass2"></textarea><span id="txtPass2Tip"></span>
</p>
<p>
<label>性別:</label>
<span>
<input id="rdbMan" type="radio" name="sex" value="男" />男
<input id="rdbWoman" type="radio" name="sex" value="女" />女
</span>
<span id="txtSexTip"></span>
</p>
<p>
<label>愛(ài)好:</label>
<span>
<input id="rdbMan1" type="checkbox" name="hobby" value="hobby1" />aa
<input id="rdbWoman2" type="checkbox" name="hobby" value="hobby2" />bb
<input id="rdbMan3" type="checkbox" name="hobby" value="hobby3" />aa
<input id="rdbWoman4" type="checkbox" name="hobby" value="hobby4" />bb
</span>
<span id="txthobbyTip"></span>
</p>
<p>
<label>地區(qū):</label>
<span>
<select id="ddlOption" name="area" multiple="multiple">
<option value="0">00000</option>
<option value="1">11111</option>
<option value="2">22222</option>
<option value="3">33333</option>
<option value="4">44444</option>
</select>
</span>
<span id="ddlOptionTip"></span>
</p>
</body>
</html>
以上是測(cè)試的部分代碼 ,不過(guò)基本可以說(shuō)明這個(gè)方法的的使用方式。
這里不多寫(xiě)了,后續(xù)不斷更新......
- jQuery 表單驗(yàn)證擴(kuò)展(四)
- jQuery 表單驗(yàn)證擴(kuò)展代碼(二)
- jQuery 表單驗(yàn)證擴(kuò)展代碼(一)
- jquery validate.js表單驗(yàn)證的基本用法入門(mén)
- jquery表單驗(yàn)證使用插件formValidator
- 基于Bootstrap+jQuery.validate實(shí)現(xiàn)Form表單驗(yàn)證
- jQuery 表單驗(yàn)證插件formValidation實(shí)現(xiàn)個(gè)性化錯(cuò)誤提示
- jquery表單驗(yàn)證插件(jquery.validate.js)的3種使用方式
- jQuery基于xml格式數(shù)據(jù)實(shí)現(xiàn)模糊查詢(xún)及分頁(yè)功能的方法
- jQuery解析XML 詳解及方法總結(jié)
- jQuery+ajax讀取并解析XML文件的方法
- jQuery擴(kuò)展+xml實(shí)現(xiàn)表單驗(yàn)證功能的方法
相關(guān)文章
jQuery EasyUI中對(duì)表格進(jìn)行編輯的實(shí)現(xiàn)代碼
對(duì)表格進(jìn)行增刪改后一次性保存或回滾的發(fā)生相當(dāng)有用。參照官方的教程例子做了個(gè)用戶(hù)管理的小例子。2010-06-06使用jQuery的ajax方法向服務(wù)器發(fā)出get和post請(qǐng)求的方法
這篇文章主要介紹了使用jQuery的ajax方法向服務(wù)器發(fā)出get和post請(qǐng)求的方法,需要的朋友可以參考下2017-01-01基于jQuery實(shí)現(xiàn)點(diǎn)擊最后一行實(shí)現(xiàn)行自增效果的表格
現(xiàn)在任何事務(wù)都追求效率和人性化,當(dāng)然網(wǎng)頁(yè)效果也是如此,如果一個(gè)可以編輯數(shù)據(jù)的表格,編輯到最后一行的時(shí)候,點(diǎn)擊可以自動(dòng)添加一行,這樣算是一個(gè)比較人性化的效果,可以免去一絲勞頓之苦,下面分享一段這樣的代碼2016-01-01jQuery prototype沖突的2種解決方法(附demo示例下載)
這篇文章主要介紹了jQuery prototype沖突的2種解決方法,分析了針對(duì)jQuery中添加代碼與沖突位置添加代碼2種情況,并附帶demo示例供讀者下載參考,需要的朋友可以參考下2016-01-01jQuery如何使用自動(dòng)觸發(fā)事件trigger
這篇文章主要介紹了jQuery如何使用自動(dòng)觸發(fā)事件trigger,需要的朋友可以參考下2015-11-11EasyUI Pagination 分頁(yè)的兩種做法小結(jié)
這篇文章主要介紹了EasyUI Pagination 分頁(yè)的兩種做法小結(jié)的相關(guān)資料,需要的朋友可以參考下2016-07-07jquery將一個(gè)表單序列化為一個(gè)對(duì)象的方法
將表單序列化為一個(gè)對(duì)象的方法有很多,在本文為大家介紹下使用jquery是如何做到的,感興趣的朋友可以參考下2014-01-01jquery實(shí)現(xiàn)隱藏在左側(cè)的彈性彈出菜單效果
這篇文章主要介紹了jquery實(shí)現(xiàn)隱藏在左側(cè)的彈性彈出菜單效果,涉及jQuery動(dòng)態(tài)操作頁(yè)面元素的顯示及隱藏技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09