最近公司開發項目在用extjs,碰到驗證的就大概的總結了一些常用的驗證。自定義的驗證主要有兩種方式:一種是單字段的自定義驗證,另一種是多字段間的驗證。對于單字段的驗證主要通過regex配置項指定自定義正規表達式進行驗證,而字段多的驗證可以通過字定義vtype類型進行驗證支援。
ext.apply(ext.form.vtypes,
{
daterange: function(val, field)
var date = field.parsedate(val);
// we need to force the picker to update values to recaluate the disabled dates display
var dispupd = function(picker)
var ad = picker.activedate;
picker.activedate = null;
picker.update(ad);
};
if (field.startdatefield)
var sd = ext.getcmp(field.startdatefield);
sd.maxvalue = date;
if (sd.menu && sd.menu.picker)
sd.menu.picker.maxdate = date;
dispupd(sd.menu.picker);
}
else if (field.enddatefield)
var ed = ext.getcmp(field.enddatefield);
ed.minvalue = date;
if (ed.menu && ed.menu.picker)
ed.menu.picker.mindate = date;
dispupd(ed.menu.picker);
return true;
},
password: function(val, field)
if (field.initialpassfield)
var pwd = ext.getcmp(field.initialpassfield);
return (val == pwd.getvalue());
passwordtext: '兩次輸入的密碼不一緻!',
chinese:function(val,field)
var reg = /^[/u4e00-/u9fa5]+$/i;
if(!reg.test(val))
return false;
chinesetext:'請輸入中文',
age:function(val,field)
try
if(parseint(val) >= 18 && parseint(val) <= 100)
catch(err)
agetext:'年齡輸入有誤',
alphanum:function(val,field)
if(!//w/.test(val))
catch(e)
alphanumtext:'請輸入英文字母或是數字,其它字元是不允許的.',
url:function(val,field)
if(/^(http|https|ftp):////(([a-z0-9][a-z0-9_-]*)(/.[a-z0-9][a-z0-9_-]*)+)(:(/d+))?//?/i.test(val))
urltext:'請輸入有效的url位址.',
max:function(val,field)
if(parsefloat(val) <= parsefloat(field.max))
maxtext:'超過最大值',
min:function(val,field)
if(parsefloat(val) >= parsefloat(field.min))
mintext:'小于最小值',
datecn:function(val,field)
var regex = /^(/d{4})-(/d{2})-(/d{2})$/;
if(!regex.test(val)) return false;
var d = new date(val.replace(regex, '$1/$2/$3'));
return (parseint(regexp.$2, 10) == (1+d.getmonth())) && (parseint(regexp.$3, 10) == d.getdate())&&(parseint(regexp.$1, 10) == d.getfullyear());
datecntext:'請使用這樣的日期格式: yyyy-mm-dd. 例如:2008-06-20.',
integer:function(val,field)
if(/^[-+]?[/d]+$/.test(val))
integertext:'請輸入正确的整數',
minlength:function(val,field)
if(val.length >= parseint(field.minlen))
return false
minlengthtext:'長度過小',
maxlength:function(val,field)
if(val.length <= parseint(field.maxlen))
maxlengthtext:'長度過大',
ip:function(val,field)
if((/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(val)))
iptext:'請輸入正确的ip位址',
phone:function(val,field)
if(/^((0[1-9]{3})?(0[12][0-9])?[-])?/d{6,8}$/.test(val))
phonetext:'請輸入正确的電話号碼,如:0920-29392929',
mobilephone:function(val,field)
if(/(^0?[1][35][0-9]{9}$)/.test(val))
mobilephonetext:'請輸入正确的手機号碼',
alpha:function(val,field)
if( /^[a-za-z]+$/.test(val))
alphatext:'請輸入英文字母'
});
另外一種方式擴充一些vtype,基本上是用正在表達式的,友善做驗證了。
:
ext.form.vtypes["hostnameval1"] = /^[a-za-z][-.a-za-z0-9]{0,254}$/;
ext.form.vtypes["hostnameval2"] = /^[a-za-z]([-a-za-z0-9]{0,61}[a-za-z0-9]){0,1}([.][a-za-z]([-a-za-z0-9]{0,61}[a-za-z0-9]){0,1}){0,}$/;
ext.form.vtypes["ipval"] = /^([1-9][0-9]{0,1}|1[013-9][0-9]|12[0-689]|2[01][0-9]|22[0-3])([.]([1-9]{0,1}[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){2}[.]([1-9][0-9]{0,1}|1[0-9]{2}|2[0-4][0-9]|25[0-4])$/;
ext.form.vtypes["netmaskval"] = /^(128|192|224|24[08]|25[245].0.0.0)|(255.(0|128|192|224|24[08]|25[245]).0.0)|(255.255.(0|128|192|224|24[08]|25[245]).0)|(255.255.255.(0|128|192|224|24[08]|252))$/;
ext.form.vtypes["portval"] = /^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$/;
ext.form.vtypes["multicastval"] = /^((22[5-9]|23[0-9])([.](0|[1-9][0-9]{0,1}|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})|(224[.]([1-9][0-9]{0,1}|1[0-9]{2}|2[0-4][0-9]|25[0-5])([.](0|[1-9][0-9]{0,1}|1[0-9]{2}|2[0-4][0-9]|25[0-5])){2})|(224[.]0[.]([1-9][0-9]{0,1}|1[0-9]{2}|2[0-4][0-9]|25[0-5])([.](0|[1-9][0-9]{0,1}|1[0-9]{2}|2[0-4][0-9]|25[0-5])))$/;
ext.form.vtypes["usernameval"] = /^[a-za-z][-_.a-za-z0-9]{0,30}$/;
ext.form.vtypes["passwordval1"] = /^.{6,31}$/;
ext.form.vtypes["passwordval2"] = /[^a-za-z].*[^a-za-z]/;
ext.form.vtypes["hostname"]=function(v){
if(!ext.form.vtypes["hostnameval1"].test(v)){
ext.form.vtypes["hostnametext"]="must begin with a letter and not exceed 255 characters"
ext.form.vtypes["hostnametext"]="l[.l][.l][.l][...] where l begins with a letter, ends with a letter or number, and does not exceed 63 characters";
return ext.form.vtypes["hostnameval2"].test(v);
ext.form.vtypes["hostnametext"]="invalid hostname"
ext.form.vtypes["hostnamemask"]=/[-.a-za-z0-9]/;
ext.form.vtypes["ip"]=function(v){
return ext.form.vtypes["ipval"].test(v);
ext.form.vtypes["iptext"]="1.0.0.1 - 223.255.255.254 excluding 127.x.x.x"
ext.form.vtypes["ipmask"]=/[.0-9]/;
ext.form.vtypes["netmask"]=function(v){
return ext.form.vtypes["netmaskval"].test(v);
ext.form.vtypes["netmasktext"]="128.0.0.0 - 255.255.255.252"
ext.form.vtypes["netmaskmask"]=/[.0-9]/;
ext.form.vtypes["port"]=function(v){
return ext.form.vtypes["portval"].test(v);
ext.form.vtypes["porttext"]="0 - 65535"
ext.form.vtypes["portmask"]=/[0-9]/;
ext.form.vtypes["multicast"]=function(v){
return ext.form.vtypes["multicastval"].test(v);
ext.form.vtypes["multicasttext"]="224.0.1.0 - 239.255.255.255"
ext.form.vtypes["multicastmask"]=/[.0-9]/;
ext.form.vtypes["username"]=function(v){
return ext.form.vtypes["usernameval"].test(v);
ext.form.vtypes["usernametext"]="username must begin with a letter and cannot exceed 255 characters"
ext.form.vtypes["usernamemask"]=/[-_.a-za-z0-9]/;
ext.form.vtypes["password"]=function(v){
if(!ext.form.vtypes["passwordval1"].test(v)){
ext.form.vtypes["passwordtext"]="password length must be 6 to 31 characters long";
ext.form.vtypes["passwordtext"]="password must include atleast 2 numbers or symbols";
return ext.form.vtypes["passwordval2"].test(v);
ext.form.vtypes["passwordtext"]="invalid password"
ext.form.vtypes["passwordmask"]=/./;
另外寫一下extjs form 元件
1、ext.form.action
配置項:
success:執行成功後回調的函數,包括兩個參數:form和action
failure:執行失敗後回調的函數,包括兩個參數:form和action
method:表單的送出方式,有效值包括get、post
params:傳遞到請求中的參數
url:動作送出的路徑
waitmsg:動作執行時顯示的等待資訊
屬性:
action.client_invalid:用戶端驗證錯誤
action.connect_failure:通信錯誤
action.load_failure:加載資料時,沒有包含data屬性的字段被傳回
action.server_invalid:服務端驗證錯誤
failuretype:錯誤類型
result:包含布爾類型的success屬性和其他屬性,如{success: true, msg: 'ok'}
type:動作類型,可選值有submit和load
ext.form.action.submit:傳回的資訊中要包含一個布爾類型的success屬性和一個可選的errors屬性
ext.form.action.load:傳回的資訊中要包含一個布爾類型的success屬性和一個data屬性
2、ext.form.basicform
baseparams:傳遞到請求中的參數
url:表單預設的送出路徑
fileupload:表單是否進行檔案上傳
timeout:表單動作的逾時時間,預設為30秒
trackresetonload:是否在表單初次建立時清楚資料
方法:
doaction( string/object actionname, [object options] ):執行一個預訂的動作,可用選項包括:
url:動作送出的路徑
method:表單的送出方式,有效值包括get、post
params:傳遞到請求中的參數
headers:
success:執行成功後回調的函數,包括兩個參數:form和action
failure:執行失敗後回調的函數,包括兩個參數:form和action
clientvalidation:是否用戶端驗證
clearinvalid():清除表單中所有的無效驗證資訊
findfield( string id ):查找表單字段
getvalues( [boolean asstring] ):
isdirty():表單資料是否被更改過
isvalid():用戶端驗證是否成功
load( object options ):執行表單讀取動作
loadrecord( record record ):從一個資料記錄中讀取資料到表單中
markinvalid( array/object errors ):成批設定表單字段為驗證無效
reset():重置表單
setvalues( array/object values ):成批設定表單字段值
submit( object options ):執行表單送出動作
updaterecord( record record ):持久化表單資料到記錄集中
3、ext.form.formpanel
items:一個元素或元素數組
buttons:一個按鈕配置對象的數組,按鈕将被添加到表單頁腳中
buttonalign:按鈕的對齊方式,可選值有left、center、right,預設為center
labelwidth:表單标簽的寬度
labelalign:表單标簽的對齊方式,可選值有left、top、right,預設為left
labelseparator:字段标簽與字段之間的分隔符,預設為':'
minbuttonwidth:按鈕的最小寬度,預設為75
方法:
getform() : ext.form.basicform
load( object options )
startmonitoring()
stopmonitoring()
4、ext.form.field
配置項:
name:字段名
value:字段的初始化值
disabled:字段是否不可用,預設為false
fieldlabel:字段标簽說明
hidelabel:隐藏字段标簽,預設為false
labelstyle:字段标簽樣式
inputtype:預設為text
invalidclass:預設為x-form-invalid
invalidtext:字段非法文本提示
msgtarget:錯誤資訊顯示的位置,預設為qtip
qtip:顯示一個浮動的提示資訊
title:顯示一個浏覽器的浮動提示資訊
under:在字段下方顯示一個提示資訊
side:在字段右邊顯示一個提示資訊
readonly:字段是否隻讀,預設為false
validateonblur:字段在失去焦點時被驗證,預設為true
clearinvalid():
getrawvalue()
setrawvalue( mixed value )
getvalue()
setvalue( mixed value )
isdirty():字段值在裝載後是否被修改過
isvalid( boolean preventmark ):目前字段值是否合法
markinvalid( [string msg] )
validate()
reset()
5、ext.form.hidden
6、ext.form.label
html:
text:
7、ext.form.textfield
allowblank:是否允許為空,預設為true
blanktext:空驗證失敗後顯示的提示資訊
emptytext:在一個空字段中預設顯示的資訊
grow:字段是否自動伸展和收縮,預設為false
growmin:收縮的最小寬度
growmax:伸展的最大寬度
inputtype:字段類型:預設為text
maskre:用于過濾不比對字元輸入的正規表達式
maxlength:字段允許輸入的最大長度
maxlengthtext:最大長度驗證失敗後顯示的提示資訊
minlength:字段允許輸入的最小長度
minlengthtext:最小長度驗證失敗後顯示的提示資訊
regex:正規表達式
regextext:正規表達式驗證失敗後顯示的提示資訊
vtype:驗證類型的名字
alpha:限制隻能輸入字母
alphanum:限制隻能輸入字母和數字
url
vtypetext:驗證失敗時的提示資訊
validator:自定義驗證函數
selectonfocus:當字段得到焦點時自動選擇已存在的文本,預設為false
8、ext.form.textarea
配置項:
preventscrollbars:是否禁止出現滾動條,預設為false
9、ext.form.numberfield
allowdecimals:是否允許輸入小數,預設為true
allownegative:是否允許輸入負數,預設為true
basechars:輸入的有效數字集合,預設為'0123456789'
decimalprecision:數字的精度,預設保留小數點後2位
decimalseparator:十進制分隔符,預設為'.'
maxvalue:允許輸入的最大數值
maxtext:超過最大值之後的提示資訊
minvalue:允許輸入的最小數值
mintext:超過最小值之後的提示資訊
nantext:輸入非有效數值之後的提示資訊
10、ext.form.checkbox
boxlabel:複選框的文字描述
checked:複選框是否被選擇,預設為false
handler:當checked值改變時觸發的函數,函數包含兩個參數:checkbox、checked
inputvalue:
getvalue():傳回複選框的checked狀态
setvalue( boolean/string checked ):
11、ext.form.checkboxgroup
allowblank:是否允許不選擇,預設為true
blanktext:
columns:顯示的列數,可選值包括:固定值auto、數值、數組(整數、小數)
items:對象數組
vertical:是否垂直方向顯示對象,預設為false
12、ext.form.radio
getgroupvalue():
setvalue( value {string/boolean} ):
13、ext.form.radiogroup
allowblank:
14、ext.form.combobox
displayfield:被顯示在下拉框中的字段名
editable:是否可編輯,預設為true
forceselection:輸入值是否嚴格為待選清單中存在的值。如果輸入不存在的值,會自動選擇第一個最接近的值。
hiddenname:隐藏字段的名字,如果提供該參數則一個隐藏字段将被建立,用來存儲所選值,當表單送出時在伺服器端可以通過該名字取得清單中的所選值
listwidth:下拉清單的寬度
minlistwidth:下拉清單的最小寬度,預設為70像素
loadingtext:當下拉框加載資料時顯示的提示資訊,隻有當mode='remote'時才會生效
maxheight:下拉清單框的最大高度,預設為300像素
minchars:下拉清單框自動選擇前使用者需要輸入的最小字元數量。mode='remote'預設為4,mode='local'預設為0
mode:下拉清單框的資料讀取模式。remote讀取遠端資料,local讀取本地資料
pagesize:下拉清單框的分頁大小。該項設定隻在mode='remote'時生效
queryparam:查詢的名字,預設為'query',将被傳遞到查詢字元串中
allquery:一個發往伺服器用來查詢全部資訊的查詢字元串,預設為空字元串''
selectonfocus:當獲得焦點時立刻選擇一個已存在的清單項。預設為false,此項隻有在editable=true時才會生效
store:清單框綁定的資料源
transform:将頁面中已存在的元素轉換為組合框
lazyinit:延時初始化下拉清單,預設為true
lazyrender:延時渲染,預設為false
triggeraction:設定單擊觸發按鈕時執行的預設操作,有效值包括all和query,預設為query,如果設定為all則會執行allquery中設定的查詢
typeahead:設定在輸入過程中是否自動選擇比對的剩餘部分文本(選擇第一個滿足條件的),預設為false
value:初始化組合框中的值
valuefield:組合框的值字段
valuenotfoundtext:值不存在時的提示資訊
tpl:ext模闆字元串或模闆對象,可以通過該配置項自定義下拉清單的顯示方式
clearvalue():清空字段目前值
doquery( string query, boolean forceall ):
getvalue():
getstore():
setvalue( string value ):
15、ext.form.datefield
maxvalue:允許選擇的最大日期
maxtext:當日期大于最大值時的錯誤提示資訊
minvalue:允許選擇的最小時間
mintext:當日期小于最小值時的錯誤提示資訊
format:日期顯示格式,預設為“m/d/y”,一般使用“y-m-d”
y:四位年份
m:帶字首0的月份
d:帶字首0的日期
y:兩位年份
n:不帶字首0的月份
j:不帶字首0的日期
w:星期的數字,0表示星期日,1代表星期一
showtoday:是否顯示今天按鈕,預設為true
altformats:多個日期輸入格式組成的字元串,不同的格式之間使用“|”進行分割,預設值為'm/d/y|n/j/y|n/j/y|m/j/y|n/d/y|m/j/y|n/d/y|m-d-y|m-d-y|m/d|m-d|md|mdy|mdy|d|y-m-d'
disableddates:禁止選擇的日期組成的數組
disableddatestext:選擇禁選日期時顯示的提示資訊
disableddays:禁止選擇的星期組成的數組,0代表星期日,1代表星期一
disableddaystext:選擇禁選星期時顯示的提示資訊
invalidtext:當日期值非法時顯示的提示資訊
getvalue():取得日期值
16、ext.form.fieldset
animcollapse:動畫折疊,預設為false
checkboxtoggle:設定是否顯示字段集的checkbox選擇框,預設為false
checkboxname:指定字段集中用于展開或隐藏字段集面闆的checkbox的名字,該屬性隻有在checkboxtoggle為true時生效
labelwidth:字段标簽的寬度,可以級聯到子容器
layout:布局,預設為form
17、ext.form.timefield
maxvalue:清單中允許的最大時間
maxtext:當時間大于最大值時的錯誤提示資訊
minvalue:清單中允許的最小時間
mintext:當時間小于最小值時的錯誤提示資訊
increment:兩個相鄰選項間的時間間隔,預設為15分鐘
format:顯示格式,預設為“g:i a”。一般使用“h:i:s”
h:帶字首0的24小時
i:帶字首0的分鐘
s:帶字首0的秒
invalidtext:當時間值非法時顯示的提示資訊
altformats:多個時間輸入格式組成的字元串,不同的格式之間使用“|”進行分割