近期因为工作需要,需要使用 Ext Core ,但是目前 Core 的扩展太少了,尤其是基于表单验证及提交的,基本没有,如果使用 Ext 本身的功能,那么库大小又增加不少。在研究了 Ext.form.Field 的代码和 vtype 代码后,决定自己写一个集成验证功能的表单提交扩展。
- Ext.namespace('Ext.ux');
- Ext.ux.submit = function(){
- var alpha = /^[a-zA-Z_]+$/;
- var alphanum = /^[a-zA-Z0-9_]+$/;
- var email = /^(/w+)([-+.][/w]+)*@(/w[-/w]*/.){1,5}([A-Za-z]){2,4}$/;
- var url = /(((https?)|(ftp)):////([/-/w]+/.)+/w{2,3}(//[%/-/w]+(/./w{2,})?)*(([/w/-/./?////+@&#;`~=%!]*)(/./w{2,})?)*//?)/i;
- return {
- emptyText : null,
- vtype:{
- 'email' : function(v){
- return email.test(v);
- },
- 'emailText' : ' 请输入正确的电子邮件地址,格式如: [email protected]',
- 'emailMask' : /[a-z0-9_/./-@]/i,
- 'url' : function(v){
- return url.test(v);
- },
- 'urlText' : ' 请输入正确的 URL 地址,格式如: http:/'+'/www.example.com"',
- 'alpha' : function(v){
- return alpha.test(v);
- },
- 'alphaText' : ' 该输入项只能包含字符和 _',
- 'alphaMask' : /[a-z_]/i,
- 'alphanum' : function(v){
- return alphanum.test(v);
- },
- 'alphanumText' : ' 该输入项只能包含字符 , 数字和 _',
- 'alphanumMask' : /[a-z0-9_]/i
- },
- run:function(opt){
- if(opt.id){
- var valid=true;
- if(Ext.isArray(opt.valid)){
- for(var i=0;i<opt.valid.length;i++){
- validvalid= valid & this.validateValue(opt.valid[i]);
- }
- }
- if(valid){
- var params={};
- var els=Ext.fly(opt.id).select("input",true).each(function(el){
- if(el.dom.id){
- params[el.dom.id]=el.dom.value;
- }
- })
- Ext.Ajax.request({
- url:opt.url,
- success:function(response,opts){
- var o = Ext.decode(response.responseText);
- if(o){
- if(o.error.length>0){
- for(var i=0;i<o.error.length;i++){
- var msgid='msg_'+o.error[i].id;
- console.log(msgid);
- Ext.fly(msgid).dom.innerHTML=o.error[i].msg;
- Ext.fly(msgid).setDisplayed("block");
- }
- }
- if(o.msg) alert(o.msg);
- }
- },
- failure:function(response,opts){
- alert(response.responseText);
- },
- params:params
- });
- }
- }
- },
- validateValue : function(o){
- var el=Ext.getDom(o.id);
- if(el){
- var value=el.value.trim();
- var msgel=Ext.get('msg_'+o.id);
- msgel.setDisplayed("none");
- if(!o.allowBlank){
- if(Ext.isEmpty(value)){
- msgel.dom.innerHTML=" 请输入 "+o.title+" ! <br/>";
- msgel.setDisplayed("block");
- return false;
- }
- }
- if(o.minLength){
- if(value.length < o.minLength){
- msgel.dom.innerHTML = " 请输入正确的 "+o.title+" ! ";
- msgel.setDisplayed("block");
- return false;
- }
- }
- if(o.maxLength){
- if(value.length > o.maxLength){
- msgel.dom.innerHTML = " 请输入正确的 "+o.title+" ! ";
- msgel.setDisplayed("block");
- return false;
- }
- }
- if(o.vtype){
- if(!this.vtype[o.vtype](value, this)){
- msgel.dom.innerHTML = this.vtype[o.vtype +'Text'];
- msgel.setDisplayed("block");
- return false;
- }
- }
- return true;
- }
- },
- };
- }();
要使用该扩展,有以下规则必须遵守:
- <div class="item"><label> 用户名称: </label><div class="element"><input type="text" id="username" value=""/><span id="msg_username" class="error"></span></div></div>
代码中 input 的 id 为“ username ”,则错误信息的元件 id 必须为“ msg_username ”。
- Ext.ux.submit.run({
- id:"form1",
- url:"test.asp?act=1",
- valid:[
- {id:'username',title:' 用户 '},
- {id:'email',title:' 电子邮件 ',vtype:'email'},
- {id:'age',title:' 年龄 ',maxLength:2,minLength:1},
- {id:'url',title:' 个人主页 ',vtype:'url'}
- ]
- });
- })
4、目前支持的校验方式如下:
- response.write "{error:[{id:'username',msg:' 请输入正确的用户名 '}],msg:''}"
JSON 结构中的 id 属性为 input 元件的 id 属性, msg 属性表示要显示的信息。