formTable 自动初始化表单与提交表单

<div id="form1" class="container login-con" dx="hv-center" form-type="form" form-site-code="@ViewBag.code" form-result="login.methods.result"
     form-action="/Home/UpdatePassword" form-source="login.methods.getData" form-send-data="login.methods.sendData">
    <div class="row rw thead-light">
        <div class="col-lg-12 text-center lg-title" form-key="sr_uid" form-data="sr_uid"></div>
        <div form-key="id" form-data="id" style="display:none;"></div>
    </div>
    <div class="row rw">
        <div class="col-lg-2 col-title">旧密码</div>
        <div class="col-lg-10">
            <input form-vali="notnull" form-err="notnull{旧密码不能为空}" form-data="pwd" form-type="focus" type="password" class="form-control" value="" />
        </div>
    </div>
    <div class="row rw">
        <div class="col-lg-2 col-title">新密码</div>
        <div class="col-lg-10">
            <input form-type="enter" form-data="sr_pwd" form-vali="notnull|s{5,10}" form-err="notnull{Password can not empty.}|s{Password length must be between 5 and 10 digits}" type="password" class="form-control" value="" />
        </div>
    </div>
    <div class="row rw">
        <div class="col-lg-2 col-title">确认</div>
        <div class="col-lg-10">
            <input form-type="enter" form-data="sr_pwd1" form-vali="notnull|s{5,10}" form-err="notnull{Password can not empty.}|s{Password length must be between 5 and 10 digits}" type="password" class="form-control" value="" />
        </div>
    </div>
    <div class="row rw">
        <div class="col-lg-6" form-type="msg" style="color:red;word-wrap:break-word;"></div>
        <div class="col-lg-6">
            <input form-type="cancel" type="button" class="btn btn-primary" style="float:left;" value="取消" />
            <input form-type="submit" type="button" class="btn btn-primary" style="float:right;" value="确定" />
        </div>
    </div>
</div>

<script type="text/javascript">
    var login = {
        methods: {
            getData: function (fm) {
                var dt = { id: @userInfo.Id, sr_uid: '@userInfo.sr_uid', sr_pwd: '', sr_pwd1: '', pwd: '' };
                fm.setData(dt);
            },
            sendData: function (form, data, siteCode) {
                if (data.sr_pwd != data.sr_pwd1) {
                    alert("两次密码输入不一致");
                    return;
                }
                form.submit();
            },
            result: function (dt) {
                if (!dt.success) {
                    alert(dt.message);
                    return;
                }
                //window.location = '/Home/Index?code=' + dt.code;
            }
        }
    }
</script>

下面是 formTable.js 源码(依赖于 jQuery)


/*
 属性:
 注:必须配置 form-type="form",  form-type="submit",  form-data="字段名称"(至少要存在一个)
     如果设置了 form-submit 配置, form-type="submit"可省略
     其中自动提交表单 form-action 必须配置(如果配置了form-send-data,则form-action可省略)
     form-site-code:如果目标站点非自身站点,该配置<必须>, 可从 ExtAjax.VisitCode 对象用获取
     可写为: form-site-code="ExtAjax.VisitCode['basic']"
             或 form-site-code="ExtAjax.VisitCode.basic"
             其中basic是appsitting.json文件VisitCode节点下的key值

 1> form-type: [*必须*]form[标识一个表单容器], [*必须*]submit[标识提交按钮], cancel[清空所有form-data项数据], 
               msg[提交表单后反馈信息显示的容器], enter[在input中当按回车时提交表单], focus[设置控件初始焦点]

 2> form-action: 表单提交路径, 当form-send-data不存在时[*必须*]
 3> form-source: 获取数据初始为表单, 对应函数体: function(formDOM){}, formDOM对象附带一个setData(data)方法
 4> form-data: [*必须*]字段名称, 可表示为{{字段名}}
 5> form-key:  主键标识, 必须和form-data一起使用
 6> form-site-code: 表单数据提交到目标站点所对应的siteCode
                    注:如果目标站点非自身站点,该配置必须

 7> form-submit: 初始为表单时, 此函数会接收到一个用于提交当前表单的方法(回调函数),可程序执行该方法动态提交表单
                 此方法名称对应函数体: function(submitObj) {}
                 其中 submitObj 对象具备一个 submit() 方法, 可异步执行该方法提交表单

 7> form-vali: 数据验证
               notnull\phone\email\idcode\n\n{1}\n{3,5}\n{5,}\n{,5}\s{1}\s{3,5}\s{5,}\s{,5}\[正则表达式]
               例: form-vali="notnull|n{5,11}"  匹配不能为空 或 大于等于5且小于等于11的数字
                   form-vali="[[^0-9]+]"        匹配非数字且不为空的所有字符

    值说明: notnull不能为空, phone手机号码11位, email邮件, idcode身份证号, n匹配数字, n{3,5}匹配数字长度必须大于等于3且小于等于5
            n{5,}匹配数字长度必须大于等于5, n{,5}匹配数字长度必须小于等于5(可为空)
            s表示任何字符, 后边匹配规则与数字相同
            [正则表达式] 中括号里表示正则表达式匹配,但不能和其它匹配规则并用

    注:     数据验证类型可以同时写入多项,多项用'|'分隔, 例: form-vali="notnull|idcode", 多项并用规则不包含自定义正则表达式

 8> form-err: 验证类型{错误提示}, 如果是自定义正则表达式'[]{错误提示}',仅使用中括号
              例: form-err="notnull{用户名不能为空!}"
                  form-err="[]{你输入的数据类型不正确}" //***** 自定义正则表达式不能与其它验证类型同时使用 ******
                  form-err="notnull{身份证号码不能为空!}|idcode{身份证号码输入不正确}"
                  
                  form-err="notnull{电话号码不能为空!}|n{电话号码输入不正确}"  //n 可对应数据验证的所有形式,例:n, n{2}, n{2,}, n{,4}, n{2,5}
                                                                               //s 同上

    注:     如果数据验证类型仅有一个, '验证类型{}'可省略不写, 例: form-err="用户名不能为空!"
 
 9> form-data-option: 一个自定义方法名称, 获取每一项form-data后执行, 这个方法名称对应函数体:function (container, fieldName, fieldValue, isSubmit) { }
    
 10> form-data-row:    一个自定义方法名称, 获取当前表单所有项form-data后执行 或 点击submit时执行(当返回为false时将终止提交数据), 
                       这个方法名称对应函数体:function (container, dataRow, isSubmit) { }
    
 11> form-result:     一个自定义方法名称, 获取提交表单完成后执行, 这个方法名称对应函数体:function (result) {}

 12> form-cancel:     一个自定义方法名称, 点击取消按钮时执行, 这个方法名称对应函数体:function (form, data) {}

 13> form-cancel-option:  一个自定义方法名称, 点击取消按钮时执行, 当返回false时则不清空该字段对应控件的值, 这个方法名称对应函数体:function (fieldname, fieldvalue) {}

 14> form-send-data: 一个自定义方法名称, 点击提交按钮时执行, 这个方法名称对应函数体:function (form, data, siteCode) {}, 如果实现该方法, 对象自带的提交方法失效

 15> form-vali-msg: 一个自定义方法名称, 点击提交按钮验证数据时执行, 这个方法名称对应函数体:function (form, control, msg) {}
 */
var formTable = function () {
    if (this == window) {
        return new formTable();
    }

    this.rgEx = (function () {
        this.rgType = /\<([a-z]+)\s+([^\<]*)(form\-type)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;
        this.rgTypeForm = /\<([a-z]+)\s+([^\<]*)(form\-type)\=((\"(form)\")|(\'(form)\'))([^\<]*)\>/i;
        this.rgTypeSubmit = /\<([a-z]+)\s+([^\<]*)(form\-type)\=((\"(submit)\")|(\'(submit)\'))([^\<]*)\>/i;
        this.rgTypeCancel = /\<([a-z]+)\s+([^\<]*)(form\-type)\=((\"(cancel)\")|(\'(cancel)\'))([^\<]*)\>/i;
        this.rgTypeMsg = /\<([a-z]+)\s+([^\<]*)(form\-type)\=((\"(msg)\")|(\'(msg)\'))([^\<]*)\>/i;
        this.rgTypeEnter = /\<([a-z]+)\s+([^\<]*)(form\-type)\=((\"(enter)\")|(\'(enter)\'))([^\<]*)\>/i;
        this.rgTypeFocus = /\<([a-z]+)\s+([^\<]*)(form\-type)\=((\"(focus)\")|(\'(focus)\'))([^\<]*)\>/i;

        this.rgSiteCode = /\<([a-z]+)\s+([^\<]*)(form\-site\-code)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;

        this.rgAction = /\<([a-z]+)\s+([^\<]*)(form\-action)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;
        this.rgSource = /\<([a-z]+)\s+([^\<]*)(form\-source)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;
        this.rgData = /\<([a-z]+)\s+([^\<]*)(form\-data)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;

        this.rgDataOption = /\<([a-z]+)\s+([^\<]*)(form\-data\-option)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;
        this.rgDataRow = /\<([a-z]+)\s+([^\<]*)(form\-data\-row)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;
        this.rgResult = /\<([a-z]+)\s+([^\<]*)(form\-result)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;
        this.rgCancel = /\<([a-z]+)\s+([^\<]*)(form\-cancel)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;
        this.rgCancelOption = /\<([a-z]+)\s+([^\<]*)(form\-cancel\-option)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;

        this.rgSendData = /\<([a-z]+)\s+([^\<]*)(form\-send\-data)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;
        this.rgValiMsg = /\<([a-z]+)\s+([^\<]*)(form\-vali\-msg)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;
        this.rgSubmit = /\<([a-z]+)\s+([^\<]*)(form\-submit)\=((\"([^\"]+)\")|(\'([^\']+)\'))([^\<]*)\>/i;
    });
    this.rgEx();

    this.focusObj = null;

    this.forms = []; //{action:'',source:'', msg: null, submit: null, result: '', cancel: null, children:[{dom:[], tagname: '', domtype: '',fieldname:'',fieldvalue:'', vali:'', err:'' , key: true}]}

    this.getFunc = (function (fName) {
        var s = null == fName ? '' : fName;
        if (0 == s.length) return;

        var arr = null;
        if (-1 != s.indexOf('.')) {
            arr = s.split('.');
        }
        else {
            arr = [s];
        }

        var fnObj = null;
        var nlen = arr.length;
        var rgFn = /[^\.\(\)]+/;
        var fn = '';
        for (var ii = 0; ii < nlen; ii++) {
            var arr1 = rgFn.exec(arr[ii]);
            if (null == arr1) break;
            fn = arr1[0];
            fnObj = 0 == ii ? window[fn] : (null == fnObj ? null : fnObj[fn]);
        }

        return fnObj;
    });

    this.findEleByContent = (function (obj, tag, atr, content) {
        var arr1 = [];
        var e = null;
        if (null != atr) {
            var s = atr;
            var rg = /([^\s\"\=]+)\s*\=\s*((\"([^\"]+)\")|(\'([^\']+)\'))/;
            var arr = rg.exec(s);
            var s1 = ',class,style,';
            while (null != arr) {
                var v = null == arr[4] ? arr[6] : arr[4];
                var t = ',' + arr[1].toLowerCase() + ',';
                if (-1 == s1.indexOf(t)) {
                    if (null == e) {
                        e = { tag: arr[1], val: v };
                    }
                    else if (e.val.length < v.length) {
                        e = { tag: arr[1], val: v };
                    }
                }
                arr1[arr1.length] = { tag: arr[1].toLowerCase(), val: v };
                s = s.replace(arr[0], '');
                arr = rg.exec(s);
            }
        }

        if (null == e) {
            var len = arr1.length;
            for (var i = 0; i < len; i++) {
                if ('style' == arr1[i].tag) {
                    e = arr1[i];
                    break;
                }
                else if ('class' == arr1[i].tag) {
                    e = arr1[i];
                    break;
                }
            }
        }

        var s = tag;
        if (null != e) {
            s = tag + '[' + e.tag + '=\"' + e.val + '\"]';
        }

        var ctl = null;
        $(obj).find(s).each(function () {
            var t = $(this).html();
            if (t == content) {
                ctl = this;
            }
        });

        return ctl;
    });

    //{ e: [], tg: tg, v: v, t: txt }
    this.matchEle = (function (rg, obj, txt, rmoveMatch) {
        if (null == this.matchEleNum) this.matchEleNum = 0;
        if (200 < this.matchEleNum) return {};
        this.matchEleNum++;

        if (null == txt) {
            txt = $(obj)[0].outerHTML;
        }

        rmoveMatch = null == rmoveMatch ? false : rmoveMatch;

        var div1 = document.createElement('div');
        $(div1).insertAfter($(obj));
        $(obj).appendTo($(div1));

        if (1 == this.matchEleNum) {
            var mbool = false;
            var html = txt;
            var s1 = '\\<([a-z]+)(\\s+[^\\<]+)?\\>([^\\>]*\\{\\{([^\\{]+)\\}\\}[^\\>]*)\\<\\/[a-z]+\\>';
            var rg1 = new RegExp(s1, 'i');
            var arr = rg1.exec(html);
            if (null != arr) mbool = true;

            while (null != arr) {
                var ctl = this.findEleByContent(div1, arr[1], arr[2], arr[3]);
                if (null == ctl) break;
                var v1 = arr[4];
                var s2 = arr[3].replace('{{' + v1 + '}}', '<span ' + arr[2] + ' form-data="' + v1 + '"></span>');
                $(ctl).html(s2);
                
                html = html.replace(arr[3], s2);
                arr = rg1.exec(html);
            }

            s1 = '\\<input[^\\<]+\\{\\{([^\\{]+)\\}\\}[^\\<]+\\/?\\>';
            rg1 = new RegExp(s1, 'i');
            arr = rg1.exec(html);
            if (null != arr) mbool = true;

            while (null != arr) {
                var v1 = arr[1];
                var ctl = $(div1).find('input[value="{{' + v1 + '}}"]');
                if (null == ctl) break;
                ctl.val('');
                ctl.attr('form-data', v1);
                ctl.attr('value', '');

                var s2 = arr[0].replace('{{' + v1 + '}}', '');
                var input1 = $(s2);
                input1.val('');
                input1.attr('form-data', v1);
                
                s2 = input1[0].outerHTML;
                html = html.replace(arr[0], s2);
                arr = rg1.exec(html);
            }

            if (mbool) {
                if (rmoveMatch) {
                    txt = html;
                }
                else {
                    txt = $(obj)[0].outerHTML;
                }
            }
        }

        var a = rg.exec(txt);
        if (null == a) return {};

        var tg = a[1];
        var sg = a[3];
        var v = a[6];
        var s = tg + '[' + sg + '="' + v + '"]';
        var e = [];

        $(div1).find(s).each(function () {
            e[e.length] = this;
            if (rmoveMatch) {
                txt = txt.replace(this.outerHTML, '');
            }
        });

        $(obj).insertAfter($(div1));
        $(div1).remove();

        return { e: e, tg: tg, v: v, t: txt };
    });

    this.getEleValue = (function (obj, tagName, type) {
        var val = '';
        tagName = tagName.toLowerCase();
        if ('input' == tagName) {
            type = null == type ? 'text' : type;
            type = type.toLowerCase();
            if ('radio' == type || 'checkbox' == type) {
                var len = obj.length;
                for (var i = 0; i < len; i++) {
                    if ($(obj[i])[0].checked) {
                        if (0 == val.length) {
                            val = $(obj[i]).val();
                        }
                        else {
                            val += ',' + $(obj[i]).val();
                        }

                        if ('radio' == type) break;
                    }
                }
            }
            else {
                val = $(obj[0]).val();
            }
        }
        else if ('select' == tagName) {
            var e = $(obj[0])[0];
            val = e.options[e.selectedIndex].value;
        }
        else {
            val = $(obj[0]).text();
        }
        return val;
    });

    //{dom:[], tagname: '', domtype: '',fieldname:'',fieldvalue:'', vali:''}
    this.initData = (function (form, data) {
        if (null == data) return;
        if (!isJson(data)) return;

        if (null == form.data) form.data = {};
        for (var k in data) {
            form.data[k] = data[k];
        }

        var childs = form.children;
        var len = childs.length;
        var isSubmit = false;

        var dataRowFunc = null;
        if (null != form.dataRow) {
            dataRowFunc = this.getFunc(form.dataRow);
            if (null != dataRowFunc) {
                dataRowFunc.apply(this, [childs, data, isSubmit]);
            }
        }

        var dataOptFunc = null;
        for (var k in data) {
            for (var i = 0; i < len; i++) {
                if (childs[i].fieldname == k) {
                    if (null != form.dataOption) {
                        dataOptFunc = this.getFunc(form.dataOption);
                        if (null != dataOptFunc) {
                            dataOptFunc.apply(this, [childs[i].dom, k, data[k], isSubmit]);
                        }
                    }
                    childs[i].fieldvalue = data[k];
                    if ('input' == childs[i].tagname) {
                        if ('radio' == childs[i].domtype) {
                            var rds = childs[i].dom;
                            var xlen = rds.length;
                            for (var x = 0; x < xlen; x++) {
                                var xv = $(rds[x]).val();
                                $(rds[x])[0].checked = false;
                                if (xv == data[k]) {
                                    $(rds[x])[0].checked = true;
                                    break;
                                }
                            }
                        }
                        else if ('checkbox' == childs[i].domtype) {
                            var avs = ',' + data[k] + ',';
                            var chks = childs[i].dom;
                            var xlen = chks.length;
                            for (var x = 0; x < xlen; x++) {
                                var xv = ',' + $(chks[x]).val() + ',';
                                $(chks[x])[0].checked = false;
                                if (-1 != avs.indexOf(xv)) {
                                    $(chks[x])[0].checked = true;
                                }
                            }
                        }
                        else {
                            var input1 = childs[i].dom;
                            $(input1).each(function () {
                                $(this).val(data[k]);
                            });
                        }
                    }
                    else if ('select' == childs[i].tagname) {
                        var slts = childs[i].dom;
                        slts = $(slts[0])[0];
                        slts.options[0].selectedIndex = 0;

                        var xlen = slts.options.length;
                        for (var x = 0; x < xlen; x++) {
                            if (data[k].toString().toLowerCase() == slts.options[x].value.toLowerCase()) {
                                slts.selectedIndex = x;
                                break;
                            }
                        }
                    }
                    else {
                        var dm = childs[i].dom;
                        $(dm).each(function () {
                            $(this).html(data[k]);
                        })
                    }
                    break;
                }
            }
        }
    });

    this.loadData = (function () {
        this.loadData.obj = this;

        this.loadData.len = this.forms.length;
        this.loadData.forms = this.forms;
        this.loadData.n = 0;
        //{action:'',source:'', auto: true, msg: null, submit: null, cancel: null
        this.loadData.for = function () {
            if (this.n >= this.len) {
                this.n = this.len - 1;
                return;
            }
            var fm = this.forms[this.n];
            var mbool = true;
            fm.source = null == fm.source ? '' : fm.source;

            var sourceFunc = null;
            if (0 == fm.source.length) {
                mbool = false;
            }
            else {
                sourceFunc = this.obj.getFunc(fm.source);
                if (null == sourceFunc) mbool = false;
            }

            fm.parentObj = this;
            fm.setData = (function (data) {
                this.parentObj.obj.initData(this, data);
            });

            if (mbool) {
                try {
                    sourceFunc.apply(this.obj, [fm]);
                } catch (e) {

                }
            }
            
            if (this.n < this.len - 1) {
                this.n++;
                this.for();
            }
        }
        this.loadData.for();
    });

    //notnull\phone\email\idcode\n\n{1}\n{3,5}\n{5,}\n{,5}\s{1}\s{3,5}\s{5,}\s{,5}\[正则表达式]
    this.validate = {
        notnull: function (a, m) {
            if (null != m) m.msg = '数据不能为空';
            if (null == a) return false;
            if (0 == a.toString().length) return false;

            var s = a.replace(/\s/g, '');
            if (0 == s.toString().length) return false;
            return true;
        },
        phone: function (a, m) {
            if (null != m) m.msg = '输入的电话号码不正确';
            if (null == a) return true;
            if (0 == a.toString().length) return true;

            var s = a.replace(/\s/g, '');
            if (0 == s.toString().length) return true;

            var rg = /^[0-9]{10}[0-9]$/;
            return (null != rg.exec(s));
        },
        email: function (a, m) {
            if (null != m) m.msg = '邮箱地址格式不正确';
            if (null == a) return true;
            if (0 == a.toString().length) return true;

            var s = a.replace(/\s/g, '');
            if (0 == s.toString().length) return true;

            var rg = /[0-9a-z_]+\@[0-9a-z_]+\.[0-9a-z_]+/i;
            return (null != rg.exec(s));
        },
        idcode: function (a, m) {
            if (null != m) m.msg = '身份证号码不正确';
            if (null == a) return true;
            if (0 == a.toString().length) return true;

            var s = a.replace(/\s/g, '');
            if (0 == s.toString().length) return true;

            var num = s;
            num = num.toUpperCase();
            if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
                return false;
            }

            var len, re;
            len = num.length;
            if (len == 15) {
                re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
                var arrSplit = num.match(re);

                var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
                var bGoodDay;
                bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
                if (!bGoodDay) {
                    return false;
                } else {
                    var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
                    var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
                    var nTemp = 0, i;
                    num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
                    for (i = 0; i < 17; i++) {
                        nTemp += num.substr(i, 1) * arrInt[i];
                    }
                    num += arrCh[nTemp % 11];
                    return true;
                }
            }
            if (len == 18) {
                re = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
                var arrSplit = num.match(re);

                var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
                var bGoodDay;
                bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
                if (!bGoodDay) {
                    return false;
                } else {
                    var valnum;
                    var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
                    var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
                    var nTemp = 0, i;
                    for (i = 0; i < 17; i++) {
                        nTemp += num.substr(i, 1) * arrInt[i];
                    }
                    valnum = arrCh[nTemp % 11];
                    if (valnum != num.substr(17, 1)) {
                        return false;
                    }
                    return true;
                }
            }
            return false;
        },
        num: function (a, n1, n2) {
            if (null == a) return true;
            if (0 == a.toString().length) return true;

            var s = a.toString().replace(/\s/g, '');
            if (0 == s.toString().length) return true;

            if (isNaN(s)) return false;

            var s1 = '';
            if (null != n1) {
                s1 = n1.toString();
                if (false == isNaN(s1)) {
                    if (null != n2) {
                        if (n1 > s.length && 0 < n1) return false;
                    }
                    else {
                        if (n1 != s.length && 0 < n1) return false;
                    }
                }
            }

            if (null != n2) {
                s1 = n2.toString();
                if (false == isNaN(s1)) {
                    if (n2 < s.length && 0 < n2) return false;
                }
            }

            return true;
        },
        char: function (a, n1, n2) {
            if (null == a) return true;
            if (0 == a.toString().length) return true;

            var s = a.toString().replace(/\s/g, '');
            if (0 == s.toString().length) return true;
            s = a.toString();

            var s1 = '';
            if (null != n1) {
                s1 = n1.toString();
                if (false == isNaN(s1)) {
                    if (null != n2) {
                        if (n1 > s.length && 0 < n1) return false;
                    }
                    else {
                        if (n1 != s.length && 0 < n1) return false;
                    }
                }
            }

            if (null != n2) {
                s1 = n2.toString();
                if (false == isNaN(s1)) {
                    if (n2 < s.length && 0 < n2) return false;
                }
            }

            return true;
        },
        regExp: function (a, rg) {
            a = null == a ? '' : a;

            if (null == rg) return true;
            if (0 == rg.toString().length) return true;
            var s1 = a.toString();

            var s = rg.toString().replace(/\s/g, '');
            if (0 == rg.toString().length) return true;

            var r = new RegExp(s, 'i');
            var arr = r.exec(s1);
            return (null != arr);
        }
    }

    this.valiFn = (function (form) {
        var childs = form.children;
        var len = childs.length;
        var mbool = true;
        var rgNum = /(^n$)|(^n\{([0-9]+)\}$)|(^n\{([0-9]*)\,([0-9]*)\}$)/;
        var rgChar = /(^s\{([0-9]+)\}$)|(^s\{([0-9]*)\,([0-9]*)\}$)/;
        var vObj = this.validate;
        var ctl = null;
        var msg = '';
        for (var i = 0; i < len; i++) {
            var tp = childs[i].domtype;
            tp = null == tp ? '' : tp;
            tp = tp.toLowerCase();
            if ('radio' == tp || 'checkbox' == tp) continue;

            var vl = childs[i].vali;
            ctl = childs[i].dom;
            vl = null == vl ? '' : vl;
            if (0 < vl.length) {
                var v = childs[i].fieldvalue;
                var s = vl.replace(/\s/g, '');
                var erg = '';
                if ('[' == s.substr(0, 1) && ']' == s.substr(s.length - 1, 1)) {
                    vl = s.substring(1, s.length - 1);
                    mbool = vObj.regExp(v, vl);
                    erg = '[]';
                    msg = '数据与你规定的正则表达式不匹配';
                }
                else {
                    var arr = [];
                    if (-1 != s.indexOf('|')) {
                        arr = s.split('|');
                    }
                    else {
                        arr = [s];
                    }

                    var nlen = arr.length;
                    var n1, n2;
                    for (var x = 0; x < nlen; x++) {
                        n1 = null, n2 = null;
                        var rgs = arr[x];
                        if (null != rgNum.exec(rgs)) {
                            var a = rgNum.exec(rgs);
                            if (null != a[4]) {
                                n1 = a[4];
                            }
                            else {
                                n1 = a[6];
                                n2 = a[7];
                            }
                            mbool = vObj.num(v, n1, n2);
                            erg = 'n';
                            msg = '数据格式不正确,必须输入一个有效的数字';
                        }
                        else if (null != rgChar.exec(rgs)) {
                            var a = rgChar.exec(rgs);
                            if (null != a[2]) {
                                n1 = a[2];
                            }
                            else {
                                n1 = a[4];
                                n2 = a[5];
                            }
                            mbool = vObj.char(v, n1, n2);
                            erg = 's';
                            msg = '字符串长度不达标';
                        }
                        else {
                            erg = rgs;
                            if (null != vObj[rgs]) {
                                var m = {};
                                mbool = vObj[rgs](v, m);
                                msg = m.msg;
                            }
                        }

                        if (!mbool) break;
                    }

                    if (!mbool) {
                        if (null != childs[i].err) {
                            var s1 = erg + '\\{([^\\{]+)\\}';
                            var r = new RegExp(s1, 'i');
                            if (null != r.exec(childs[i].err)) {
                                var b = r.exec(childs[i].err);
                                msg = b[1];
                            }
                            else if (1 == nlen) {
                                msg = childs[i].err;
                            }
                        }
                        break;
                    }
                }

                if (!mbool) {
                    if (null != childs[i].err) {
                        var s1 = '\\[\\]\\{([^\\{]+)\\}';
                        var r = new RegExp(s1, 'i');
                        if (null != r.exec(childs[i].err)) {
                            var b = r.exec(childs[i].err);
                            msg = b[1];
                        }
                        else {
                            msg = childs[i].err;
                        }
                    }
                }
            }
            if (!mbool) break;
        }

        if (!mbool) {
            this.showMsg(form, msg, ctl[0]);

            $(ctl[0]).select();
        }
        return mbool;
    });

    this.showMsg = (function (form, msg, ctl) {
        var mg = null;
        if (null != form.valiMsg) {
            mg = this.getFunc(form.valiMsg);
        }

        msg = null == msg ? '' : msg;

        if (null != mg) {
            if (0 == msg.length) return;
            mg.apply(form, [form, ctl, msg]);
        }
        else if (null != form.msg) {
            $(form.msg).html(msg);
        }
        else {
            if (0 == msg.length) return;
            alert(msg);
        }
    });

    this.sendData = (function (form, data) {
        var action = form.action;
        action = null == action ? '' : action;
        if (null == action.length) {
            this.showMsg(form, 'form-action属性值不能为空', form);
            return;
        }

        var result = form.result;
        result = null == result ? '' : result;

        var resultFunc = null;
        if (0 < result.length) {
            if (0 < result.length) {
                resultFunc = this.getFunc(result);
            }
        }

        //ExtAjax.VisitCode
        var siteCode = form.siteCode;
        siteCode = null == siteCode ? '' : siteCode;
        if ((-1 != siteCode.indexOf('[') && -1 != siteCode.indexOf(']')) || -1 != siteCode.indexOf('.')) {
            var arr = /\[([^\[]+)\]/.exec(siteCode);
            if (null != arr) {
                var s = siteCode.replace(arr[0], '');
                siteCode = arr[1];
                siteCode = siteCode.replace('"', '');
                siteCode = siteCode.replace("'", "");
                siteCode = s + '.' + siteCode;
            }
            
            arr = siteCode.split('.');
            var nlen = arr.length;
            for (var i = 0; i < nlen; i++) {
                siteCode = 0 == i ? window[arr[i]] : (null == siteCode ? {} : siteCode[arr[i]]);
            }
        }

        ExtAjax({
            url: action,
            datas: data,
            result: resultFunc,
            formObj: this,
            form: form,
            VisitCode: siteCode,
            success: function (dt) {
                var resultFunc = this.result;

                if (null != resultFunc) {
                    resultFunc.apply(form, [dt]);
                }
                else {
                    var s = '';
                    if (null != dt) {
                        if (isJson(dt)) {
                            for (var k in dt) {
                                s += ',"' + k + '": "' + dt[k] + '"';
                            }
                            if (0 < s.length) s = s.substr(1);
                        }
                        else {
                            s = dt.toString();
                        }
                    }

                    s = 0 == s.length ? 'NULL' : s;
                    s = '{' + s + '}';
                    this.formObj.showMsg(this.form, s);
                }
            }
        });
    });

    this.submit = (function (form) {
        var fm1 = form;
        var childs = fm1.children;
        var len1 = childs.length;
        var dt = {};
        var dataOptFunc = null;
        for (var i = 0; i < len1; i++) {
            var v1 = this.getEleValue(childs[i].dom, childs[i].tagname, childs[i].domtype);
            if (null != fm1.dataOption) {
                dataOptFunc = this.getFunc(fm1.dataOption);
                if (null != dataOptFunc) {
                    var v2 = dataOptFunc.apply(this, [childs[i].dom, childs[i].fieldname, v1, isSubmit]);
                    if (null != v2) {
                        if (isJson(v2)) v2 = null;
                    }
                    v1 = null == v2 ? v1 : v2;
                }
            }
            childs[i].fieldvalue = v1;
            dt[childs[i].fieldname] = v1;
        }

        var mbool = true;
        var dataRowFunc = null;
        if (null != fm1.dataRow) {
            dataRowFunc = this.getFunc(fm1.dataRow);
            if (null != dataRowFunc) {
                mbool = dataRowFunc.apply(fm1, [childs, dt, true]);
                mbool = null == mbool ? true : mbool;
            }
        }

        if (mbool) {
            mbool = this.valiFn(fm1);
        }

        if (mbool) {
            this.showMsg(fm1, '', fm1);
            var sendDt = null;
            if (null != fm1.sendData) {
                sendDt = this.getFunc(fm1.sendData);
            }

            if (null == sendDt || false == fm1.submitCallback.isAuto) {
                fm1.submitCallback.isAuto = true;
                this.sendData(fm1, dt);
            }
            else {
                sendDt.apply(this, [fm1.submitCallback, dt]);
            }
        }
    });

    this.initEvent = (function () {
        var fms = this.forms;
        var len = fms.length;
        for (var i = 0; i < len; i++) {
            var fm = fms[i];
            if (null != fm.submit) {
                $(fm.submit)[0].obj = this;
                $(fm.submit)[0].formObj = fm;
                $(fm.submit).bind('click', function () {
                    var fm1 = this.formObj;
                    this.obj.submit(fm1);
                });
            }

            fm.submitCallback = {
                form: fm,
                obj: this,
                isAuto: true,
                submit: function () {
                    this.isAuto = false;
                    this.obj.submit(this.form);
                }
            }

            if (null != fm.submitFn) {
                var submitFn = this.getFunc(fm.submitFn);

                if (null != submitFn) {
                    submitFn.apply(fm, [fm.submitCallback]);
                }
            }

            if (null != fm.cancel) {
                $(fm.cancel)[0].obj = this;
                $(fm.cancel)[0].formObj = fm;
                $(fm.cancel).bind('click', function () {
                    var fm1 = this.formObj;
                    var childs = fm1.children;
                    var len1 = childs.length;
                    var dt = {};
                    for (var i = 0; i < len1; i++) {
                        dt[childs[i].fieldname] = childs[i].fieldvalue;
                    }

                    var mbool = true;
                    if (null != this.formObj.cancelFn) {
                        var cancelFunc = this.obj.getFunc(this.formObj.cancelFn);
                        if (null != cancelFunc) {
                            mbool = cancelFunc.apply(this, [fm1, dt]);
                            mbool = null == mbool ? true : mbool;
                        }
                    }

                    if (mbool) {
                        var cancelOpt = function () { };
                        if (null != this.formObj.cancelOption) {
                            var cancelOptFn = this.obj.getFunc(this.formObj.cancelOption);
                            if (null != cancelOptFn) {
                                cancelOpt = cancelOptFn;
                            }
                        }

                        dt = {};
                        for (var i = 0; i < len1; i++) {
                            mbool = cancelOpt.apply(this, [childs[i].fieldname, childs[i].fieldvalue]);
                            mbool = null == mbool ? true : mbool;

                            if (childs[i].key) mbool = false;

                            if (mbool) {
                                dt[childs[i].fieldname] = '';
                            }
                        }

                        this.obj.initData(this.formObj, dt);
                    }
                });
            }

            if (null != fm.enter) {
                var enterObj = { obj: this, formObj: fm };
                $(fm.enter).each(function () {
                    for (var k in enterObj) {
                        this[k] = enterObj[k];
                    }

                    $(this).bind('keyup', function () {
                        var e = null != window.event ? window.event : window.Event;
                        if (13 == e.keyCode) {
                            var fm1 = this.formObj;
                            this.obj.submit(fm1);
                        }
                    });
                })
            }
        }
    });

    this.init = (function () {
        if (null != this.lockInit) return;
        this.lockInit = this.init;

        var txt = window.document.body.innerHTML;
        var arr = this.rgTypeForm.exec(txt);
        if (null == arr) return;

        var formNum = 0;
        while (null != arr) {
            formNum++;
            this.matchEleNum = 0;
            txt = txt.replace(arr[0], '');

            var tg = arr[1];
            var s = tg + '[form-type="form"]';
            var fm = $(document.body).find(s)[0];
            $(fm).attr('form-type', 'form-' + formNum);

            var id = $(fm).attr('id');

            var ele = { id: id }; //{action:'',source:'', msg: null, submit: null, result: '', cancel: null
            var e = this.matchEle(this.rgAction, fm);
            ele.action = e.v;

            e = this.matchEle(this.rgSource, fm);
            ele.source = e.v;

            e = this.matchEle(this.rgDataOption, fm);
            ele.dataOption = e.v;

            e = this.matchEle(this.rgDataRow, fm);
            ele.dataRow = e.v;

            e = this.matchEle(this.rgSiteCode, fm);
            ele.siteCode = e.v;

            e = this.matchEle(this.rgResult, fm);
            ele.result = e.v;

            e = this.matchEle(this.rgCancel, fm);
            ele.cancelFn = e.v;

            e = this.matchEle(this.rgCancelOption, fm);
            ele.cancelOption = e.v;

            e = this.matchEle(this.rgSendData, fm);
            ele.sendData = e.v;

            e = this.matchEle(this.rgValiMsg, fm);
            ele.valiMsg = e.v;

            e = this.matchEle(this.rgSubmit, fm);
            ele.submitFn = e.v;
            
            e = this.matchEle(this.rgTypeMsg, fm);
            ele.msg = null == e.e ? null : e.e[0];

            e = this.matchEle(this.rgTypeEnter, fm);
            ele.enter = null == e.e ? null : e.e[0];

            e = this.matchEle(this.rgTypeSubmit, fm);
            ele.submit = null == e.e ? null : e.e[0];

            e = this.matchEle(this.rgTypeCancel, fm);
            ele.cancel = null == e.e ? null : e.e[0];

            e = this.matchEle(this.rgTypeFocus, fm);
            ele.focus = null == e.e ? null : e.e[0];
            this.focusObj = ele.focus;

            var childs = [];
            e = this.matchEle(this.rgData, fm, null, true);
            ele.data = {};
            while (null != e.e) {
                var ee = $(e.e[0]);
                var tp = ee.attr('type');
                var vali = ee.attr('form-vali');
                var err = ee.attr('form-err');
                var key = ee.attr('form-key');
                key = null == key ? false : true;
                var v = this.getEleValue(e.e, e.tg, tp);
                var c = { dom: e.e, tagname: e.tg, domtype: tp, fieldname: e.v, fieldvalue: v, vali: vali, err: err, key: key };
                var tagname = e.tg.toLowerCase();
                if ('input' == tagname || 'select' == tagname || 'textarea' == tagname) {
                    var e1 = e.e;
                    var len1 = e1.length;
                    for (var xi = 0; xi < len1; xi++) {
                        var qe1 = $(e1[xi]);
                        qe1[0].dt = c;
                        qe1[0].data = ele.data;
                        qe1[0].data[c.fieldname] = '';
                        qe1[0].field_name = c.fieldname;
                        if ('text' == tp || 'password' == tp || 'textarea' == tagname) {
                            qe1.bind('blur', function () {
                                this.dt.fieldvalue = this.value;
                                this.data[this.field_name] = this.value;
                            });
                        }
                        else if ('radio' == tp) {
                            qe1.bind('click', function () {
                                this.dt.fieldvalue = this.value;
                                this.data[this.field_name] = this.value;
                            });
                        }
                        else if ('checkbox' == tp) {
                            qe1.bind('click', function () {
                                var v = this.dt.fieldvalue;
                                v = null == v ? '' : v;
                                if (this.checked) {
                                    if (0 == v.length) {
                                        v = this.value;
                                    }
                                    else {
                                        v += ',' + this.value;
                                    }
                                }
                                else {
                                    var v1 = this.value;
                                    var arr1 = v.split(',');
                                    var len1 = arr1.length;
                                    v = '';
                                    for (var ii = 0; ii < len1; ii++) {
                                        if (v1 == arr1[ii]) continue;
                                        v += ',' + arr1[ii];
                                    }
                                    if (0 < v.length) v = v.substr(1);
                                }
                                this.dt.fieldvalue = v;
                                this.data[this.field_name] = v;
                            });
                        }
                        else if ('select' == tagname) {
                            qe1.bind('change', function () {
                                var v = this.options[this.selectedIndex].value;
                                this.dt.fieldvalue = v;
                                this.data[this.field_name] = v;
                            });
                        }
                    }
                }

                childs[childs.length] = c;
                var html = e.t;
                e = this.matchEle(this.rgData, fm, html, true);
            }

            ele.children = childs;

            this.forms[this.forms.length] = ele;

            arr = this.rgTypeForm.exec(txt);
        }

        this.initEvent();

        this.loadData();

        if (null == this.focusObj) return;
        $(this.focusObj).setFocus();
    });
    this.init();
}
var FormTable$ = null;
$(document).ready(function () {
    FormTable$ = formTable();
});
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值