namespace javascript ajaxform 功能以及客户端js自动验证

Ns.UI.AjaxForm = function () {
    Ns.UI.Control.apply(this, arguments);
    this.onError = null;
    this.onSuccess = null;
    this.onBeforSend = null;
    this.onComplete = null;
    this.successFn = "";
    this.validateFn = "";
    this._ajax = null;
    this.data = {};
    this.async = true;
    this.submitBtn = "";
    this.resetBtn = "";
    this.encrypt = "default";
    this.validateFailt = "";
    this._init = function () { if (Ns.UI.Control.prototype._init) { Ns.UI.Control.prototype._init.apply(this, null); } var that = this; this._ajax = new Ns.Data.BaseAjax(); "Error,BeforSend,Complete,Success".split(",").each(function (i, name) { var e = "on" + this; that[e] = new Ns.Event.EventTarget(); that[e].currentTarget = that; that._ajax[e] = that[e]; that[e].eventName = this; }); }
    this.validate = function () {
        var retbol = false, isMuliteErr = this.isMultiErr;
        this.select("[ns-validate]").found.each(function () {
            var type = this.type;

var val = Ns.DOM.Operater.val(this),

vali = Ns.DOM.Operater.attr(this, "ns-validate")//获取保存在标签内的验证规则

, valiJson = Ns.Data.Json.NoJson(vali), evtarget, vfn, state = 0, that = this, validateFailt = false;
            if (!valiJson) { return; } vfn = NsHelper.judge.strEmpty(valiJson.validateFn) ? null : Ns.UI.AjaxForm.ValidateFns[valiJson.validateFn];
            // " rules:{ regexp:/y/i,message:‘message‘,rule:true/false },target:‘‘,errorcls:,notnul,nultext"  规则基本格式
            evtarget = Ns.DOM.find(valiJson.target)[0];
            Ns.DOM.Operater.removeClass(this, valiJson.errorcls);
            if (valiJson.notnul == true && !val) {

Ns.DOM.Operater.addClass(this, valiJson.errorcls);

!isMuliteErr && retbol ? "" : Ns.DOM.Operater.text(evtarget, valiJson.nultext);

//此处为什么添加前面判断,是为了ajaxform的显示错误提示信息是否为同一表签内,

//isMultiErr表示 true为每个input控件都含有自己的对应错误提示框,false表示为只有一个提示标签

retbol |= true; NsHelper.judge.fnRun(vfn, { validate: valiJson, state: -1, validateFailt: true, currentDOM: this }); return; }
            NsHelper.judge.each(valiJson.rules, function (i, args) {
                if (!(this.regexp && this.regexp.test)) { state = 0; return; }
                var test = this.regexp.test(val);
                if (test && (this.rule == true || NsHelper.judge.unNl(this.rule))) {

!isMuliteErr && retbol ? "" : Ns.DOM.Operater.text(evtarget, this.message);

Ns.DOM.Operater.addClass(that, valiJson.errorcls); retbol |= true; state = -1; validateFailt = true; return true;

}
                if (!test && this.rule == false) {

!isMuliteErr && retbol ? "" : Ns.DOM.Operater.text(evtarget, this.message);

Ns.DOM.Operater.addClass(that, valiJson.errorcls); retbol |= true; validateFailt = true; return true; }

});
            NsHelper.judge.fnRun(vfn, { validate: valiJson, state: -1, validateFailt: validateFailt, currentDOM: this });

//如果vfn为函数,则运行,并将后一个参数作为参数传递给vfn

});
        if (this.validateFailt) { NsHelper.judge.fnRun(Ns.UI.AjaxForm.ValidateFns[this.validateFailt], retbol); }
        return retbol;
    }
    this.submit = function () { if (this.currentDOM.submit) { this.currentDOM.submit(); } }
    this.reset = function () { if (this.currentDOM.reset) { this.currentDOM.reset(); } }
    this.isMultiErr = false;
    this.init = function () {
        this._ajax.url = this.currentDOM.action; this._ajax.dataType = "json"; this._ajax.async = this.async; this._ajax.type = this.currentDOM.method;
        if (Ns.UI.AjaxForm.SuccessFns[this.successFn]) { this._ajax.onSuccess.addEvent(Ns.UI.AjaxForm.SuccessFns[this.successFn]); }
        var that = this;
        if (this._ajax.async) { this.currentDOM.submit = function (e) { if (that.validate() == true) { return; } that.serialize(); if (NsHelper.judge.fnRun(Ns.UI.AjaxForm.ValidateFns[that.validateFn]) !== true) { that.send(); } } }
        if (this.submitBtn) { var td = Ns.DOM.find(this.submitBtn)[0]; if (td) { Ns.Event.EventHelper.bind(td, "click", function () { that.submit(); }); } }
        if (this.resetBtn) { var td = Ns.DOM.find(this.resetBtn)[0]; if (td) { Ns.Event.EventHelper.bind(td, "click", function () { that.reset(); }); } }
    }
//序列form传输数据 
    this.serialize = function () {
        var that = this, den;
        if (this.encrypt.toLowerCase() === "default") { den = Ns.Data.Base64.encodeURI; }//加密编码规则函数
        else {

this.encrypt.replace("-", ".");//加密规则函数调用所有方法路径    Ns-Data-Encrypt-encrypt   这里是-是分割,,,主要避免.点的选择符的冲突

den = NsHelper.gotoNs(this.encrypt); }
        this.select("*").found.each(function () {
            var type = this.type;
            if (this.name && type && !Ns.DOM.Operater.property(this, "disabled")[0] && /^(?:input|select|textarea|keygen)/i.test(this.nodeName) && ! /^(?:submit|button|image|reset|file)$/i.test(type) && (this.checked || !/^(?:checkbox|radio)$/i.test(type))) {
                var val = Ns.DOM.Operater.val(this), encrypt; encrypt = Ns.DOM.Operater.attr(this, "ns-encrypt");
                if (!val) { val = ""; } if (encrypt == true) { val = den(val); } that.data[this.name] = val;
            }
        });

this._ajax.data = that.data; return that.data;
    }
    this.send = function () { this._ajax.send(); }
    NsHelper.CONSTRUCT.apply(this, arguments);
}
Ns.Extend.pro(Ns.UI.AjaxForm, Ns.UI.Control);
Ns.UI.AjaxForm.DisposeForm = function (ajaxform) { if (ajaxform.successFn) { delete Ns.UI.AjaxForm.SuccessFns[ajaxform.successFn]; } if (ajaxform.validateFn) { delete Ns.UI.AjaxForm.ValidateFns[ajaxform.validateFn]; } }
Ns.UI.AjaxForm.SuccessFns = {};
Ns.UI.AjaxForm.ValidateFns = {};
Ns.UI.AjaxForm.AutoAjax = function (exp, config) {

config = config ? config : {};

/*new   init  send  */

var ajaxForm = new Ns.UI.AjaxForm();

ajaxForm.find(exp);

ajaxForm.AttrToProp();//将ns-data的属性值赋值给自身对象  来自父类  Ns.UI.Control

if (config.success) {

var code = "successFn_" + new Date().valueOf();

ajaxForm.successFn = code; Ns.UI.AjaxForm.SuccessFns[code] = config.success;

}

if (config.validiate) { var code = "validate_" + new Date().valueOf();

ajaxForm.validateFn = code; Ns.UI.AjaxForm.ValidateFns[code] = config.validate; }

if (config.encrypt) { ajaxForm.encrypt = config.encrypt; } ajaxForm.init(); return ajaxForm;

}

AjaxForm  的实现依靠namespace.js的库,,,主要的功能包含了序列form提交的数据,验证,发送。

AjaxForm 采用的了混合继承的方式来完成继承功能AutoAjax  运行过程  为主要实例化ajaxform对象,再找到form对象进init的初始化  其中init初始化是根据ns-data属性值进行初始化,将ns-data转化为json,然后赋值给ajaxform变量,然后依次绑定相应的事件行为例如:

ns-data = "successFn:‘ajaxFormSuccess/*函数名存储在Ns.UI.AjaxForm.SuccessFns空间内*/‘

,submitBtn:‘.login_btn/*提交按钮选择表达式*/‘

,validateFn:‘ajaxFormValidate/*自定义验证函数名存储在Ns.UI.AjaxForm.ValidateFns空间内*/‘

,validateFailt:‘validate/*自动化验证(ajaxForm内验证失败的时的函数名存储在Ns.UI.AjaxForm.ValidateFns空间内)*/‘

,isMultiErr:false"而 自动化验证表达式则在标签内添加

验证规则则保存在标签内,以ns-validate属性保存

ns-validate属性

ns_validate = "rules:[]/*正则规则*/

,target:‘.error_text/*错误信息显示在哪*/‘

,errorcls:‘error_ipt/*验证未通过,标签添加的类*/‘

,notnul:true/*是否允许为null*/

,nultext:‘登陆用户名不能为空‘/*未null时提醒错误信息*/" }

rules=[] ===>  regexp:  正则表达式 ,message:提醒消息   rule:true/false

正则表达式匹配的结果为true还是false时是未通过rules 是个数组,但是依次按照原有的顺序进行正则验证

namespace javascript ajaxform 功能以及客户端js自动验证

时间: 2024-10-08 07:36:46

namespace javascript ajaxform 功能以及客户端js自动验证的相关文章

(分享)在myeclipse上安装spket插件,实现js自动提醒功能

myeclipse没有配置spket插件的时候,js是无法自动提示js自动显示的功能的: -------下面我将从头开始,一步一步的开始操作,将myeclipse配上自动提醒插件:ps:带有jar下载链接 1 . 下载最新破解版spket1.6.18(见下面链接地址) 目前的myEclipse的插件安装很简单的,把spket1.6.18破解版的.zip解压后复制到myeclipse的安装目录下的features和dropins文件夹下即可.如图: 安装完成后,重启myelipse,打开Windo

jQuery Validate【为表单提供了强大的验证功能,让客户端表单验证变得更简单】

jQuery Validate jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证,同时提供了一个用来编写用户自定义方法的 API.所有的捆绑方法默认使用英语作为错误信息,且已翻译成其他 37 种语言. 该插件是由 J?rn Zaefferer 编写和维护的,他是 jQuery 团队的一名成员,是 jQuery UI 团队的主要开发人员,是 QUn

Visual Studio 2017 的 JavaScript 调试功能的关闭

关闭方法其实很简单,Options => Debugging => General => Enable JavaScript debugging for ASP.NET (Chrome and IE),取消勾选即可. 问题是为什么要关闭?其实我基本用不到JS调试功能,而且VS2017自动使用一个新的Profile打开Chrome浏览器,感觉很不爽,自己设置的Chrome特色配置都没了,Bookmark也没了,太不方便!还一个最大的问题,就是一旦停止调试,Chrome立即自动关闭,这点实在

本地java代码和javascript进行交互(java和js互调)

在android的开发过程中,有很多时候需要用到本地java代码和javascript进行交互.android对交互进行了很好的封装,在开发中我们可以很简单的用java代码调用webview中的js,也可以用webview中的js来调用本地的java代码,这样我们可以实现很多原来做不了的功能,比如点击网页上的电话号码后,手机自动拨打电话,点击网页中的笑话,自动发送短信等. 废话不多说,这次教程的目标如下 android 中的java代码调用webview里面的js脚本 webview中的js脚本

JavaScript 常用功能总结

编吐血整理加上翻译,太辛苦了~求赞! 本文主要总结了JavaScript 常用功能总结,如一些常用的额JS 对象,基本数据结构,功能函数等,还有一些常用的设计模式. 目录: 众所周知,JavaScript是动态的面向对象的编程语言,能够实现以下效果: 1. 丰富Web 网页功能 2. 丰富Web界面 3. 实现本地或远程存储. 4. 实现分布式网络应用的前端组件,并在后台进行数据存储管理. 5. 使用JavaScript可以实现完整的分布式Web 应用. JavaScript 中的数据类型 Ja

基于HTML5的PACS--HTML5图像处理(7)实现客户端JS调整窗宽窗位

仅提供参考和学习,代码仅为了指明个思路,转载请注明出处. 要查看此系统更多的图像处理功能请参考: 区域医疗移动医疗影像解决方案--基于HTML5的PACS--HTML5图像处理 在此之前,此系统是结合DICOM的WADO标准,在浏览器里通过javascript操作返回的JPG图片.这种服务器端解析,客户端展现的方式,对实现图像的移动.缩放.旋转.测量等图像操作能够实现实时的交互.但这种方式存在着几个弊端: 1.获取图像上的CT值(钙化值)信息的时候,要频繁的和服务器进行交互. 2.调整图像的窗宽

Javascript模块化编程:require.js的用法

Javascript模块化编程:require.js的用法 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代码,相信很多人都见过. <script src="1.js"></script> <script src="2.js"></script> <script

JavaScript必备:Google发布的JS代码规范(转)

[翻译]关于Google发布的JS代码规范,你需要了解什么? 翻译 | WhiteYin 译文 | https://github.com/WhiteYin/translation/issues/10 Google为了那些还不熟悉代码规范的人发布了一个JS代码规范.其中列出了编写简洁易懂的代码所应该做的最佳实践. 代码规范并不是一种编写正确JavaScript代码的规则,而是为了保持源代码编写模式一致的一种选择.对于JavaScript语言尤其如此,因为它灵活并且约束较少,允许开发者使用许多不同的

MyEclipse 中 添加 js自动完成模版

MyEclipse 中 添加 js自动完成模版: window>preference>MyEclipse>Files and Editors>JavaScript>Editor>Templates|New 进行添加.在编写的过程中可以进行变量的添加: 例如:Name: clg Pattern: console.log(${});${cursor} 这样在()中输入之后,再回车就到行尾了: 还有其他变量可以进行了解: