纯 javascript 表单验证插件 ie 5,6,7,8,9,10 测试通过

由于只是初步测试通过,还有很多功能未去完善,比如单选和多选项等的验证

1.由于是纯js的,所以首先是获取dom对象的js

(function (_this) {
    _window = _this ? _this.window : window;
    _window.thsoft = _window.thsoft || {};
    _window.thsoft.dom = _window.thsoft.dom || {};
    _window.thsoft.dom.tools = {
        /*
        parentNode:目标节点,要添加子几点的对象
        */
        appendElement: function (parentNode, newNode) {
            if (typeof parentNode != ‘object‘) {
                alert("The target[parentNode] is not an HTMLElement!");
                return false;
            }
            if (typeof newNode != ‘object‘) {
                alert("The target[newNode] is not an HTMLElement!");
                return false;
            }
            parentNode.appendChild(newNode);
            return newNode;
        },
        appendText: function (node, text) {
            if (typeof node != ‘object‘) {
                alert("The target[parentNode] is not an HTMLElement!");
                return false;
            }
            if (node.tagName == ‘INPUT‘)
                node.value += text;
            else
                node.innerHTML += text;

            return true;
        },
        /*
        parentNode:目标节点,要添加子几点的对象
        newNode:要添加的对象
        */
        removeElement: function (parentNode, newNode) {
            if (typeof parentNode != ‘object‘) {
                alert("The target[parentNode] is not an HTMLElement!");
                return false;
            }
            if (typeof newNode != ‘object‘) {
                alert("The target[newNode] is not an HTMLElement!");
                return false;
            }
            parentNode.removeChild(newNode);
            return true;
        },
        /*
        tagName:要创建的节点名称
        attrObj:要为新节点添加的属性 {‘$width‘:‘100px‘}$: 表示标签的style属性 不带$表示标签属性;
        */
        createElement: function (tagName, attrObj) {
            if (tagName === "" || tagName === undefined) {
                alert("tagName is undefined!");
                return false;
            }
            var newNode = document.createElement(tagName);
            thsoft.dom.tools.setAttribute(newNode, attrObj);
            return newNode;
        },
        setAttribute: function (node, attrObj) {
            var cssText = ""; 

            for (var item in attrObj) {
                if (item.indexOf(‘$‘) != -1) {
                    cssText += item.replace(‘$‘,‘‘) + ":" + attrObj[item] + ";";
                    continue;
                }
                //此处需要解决兼容性
                if (item === ‘event‘) {
                    thsoft.tools.event.addEvent(node, attrObj[item].name, attrObj[item].handle);
                }
                else if (item === ‘innerHTML‘)
                    node.innerHTML = attrObj[item];
                else
                    node.setAttribute(item, attrObj[item]);
            }

            node.style.cssText = cssText;
            node.setAttribute(‘style‘, cssText);
            return node;
        },
        //设置对象样式
        css: function (node, attrObj) {
            for (var item in attrObj)
                node.style[item.replace(‘$‘, ‘‘)] = attrObj[item];
        },
        ///调用方法 id:#id class and attribute tagName[attrName=attrValue]
        getNode: function (attrName) {

            ///优先Id获取
            var cursor = attrName.indexOf(‘#‘);
            if (cursor !== -1)
                return _window.document.getElementById(attrName.replace(‘#‘, ‘‘));
            //class获取 方式如:input[class=cname]
            var cursors = attrName.replace(‘[‘, ‘,‘).replace(‘]‘, ‘,‘).replace(‘=‘, ‘,‘).split(‘,‘);

            if (cursors.length !== 4) return null;

            //tn:tagName cn:className cv:class value
            var tn = cursors[0], cn = cursors[1], cv = cursors[2];
            nodes = _window.document.getElementsByTagName(tn); n = [];
            for (var i = 0; i < nodes.length; i++)
                if (nodes[i].attributes[cn].value === cv)
                    n.push(nodes[i]);

            return n;
        }

    };

})(this);

2.dom元素辅助插件写好后就开始写验证插件

(function (_this) {
    _window = _this ? _this.window : window;
    _window.thsoft = _window.thsoft || {};
    _window.thsoft.validator = {
        objects: {
            form: {},
            formElements: {},
            tipPanels: {},
            tipIcons: {},
            submitBtns: [],
            callback: null,
            tipPanelParms: {
                $width: ‘200px‘,
                $position: ‘absolute‘,
                $background: ‘white‘,
                $border: ‘1px solid #007acc‘,
                tabIndex: 1,
                $padding: ‘5px‘
            }

        },
        config: {
            isForm: true,
            erroColor: ‘#ffa9a9‘,
            tipType: {
                info: {
                    icon: "url(‘Script/thsoft.validator/icon/info.png‘) no-repeat center",
                    foreColor: ‘#007acc‘
                },
                erro: {
                    icon: "url(‘Script/thsoft.validator/icon/erro.png‘) no-repeat center",
                    foreColor: ‘red‘
                },
                pass: {
                    icon: "url(‘Script/thsoft.validator/icon/pass.png‘) no-repeat center",
                    foreColor: ‘green‘
                }
            }
        },
        /*验证规则*/
        rule: {
            num: /^[0-9]*$/,
            name: function (v) { if (v == 1) return true; }
        },
        //todo 验证错误的提示
        tip: {
            num: ‘您输入的不是数字!‘,
            pass: ‘验证通过!‘,
            nullMsg: ‘此项为必填项!‘,
            ignorMsg: ‘此项可为空!‘,
            erroMsg: ‘验证失败!请确认输入的值是否正确!‘

        },
        /* todo:
           parms:参数 可配置 提交按钮 验证规则rule,验证提示消息
           配置提交按钮 支持tagNam[type=typevalue] .btn #btn 方式
           毁掉函数:callback
           调用方式:
           thsoft.validator.init({
                submitBtn: ‘.btn‘,
                rule: {
                    num: /^[0-9]*$/
                },
                Msgs: {
                    num: ‘您输入的不是数字!‘
                },
                callback:function(){

                }
            });
        */
        init: function (parms) {
            //todo 初始化 

            for (var items in parms) {
                if (items === ‘submitBtn‘)
                    thsoft.validator.objects.submitBtns.push(thsoft.dom.tools.getNode(parms[items]));

                else if (items === ‘rule‘)
                    for (var item in parms[items])
                        thsoft.validator.rule[item] = parms[items][item];
                else if (items === ‘Msgs‘)
                    for (var i in parms[items])
                        thsoft.validator.tip[item] = parms[items][item];
                else if (items === ‘callback‘)
                    thsoft.validator.objects.callback = parms[items];

            }
            form = thsoft.dom.tools.getNode(‘form[verify=true]‘);
            if ((form == null || form.length == 0) && !thsoft.validator.config.isForm) {
                alert("未找到任何form,请检查是否有form表单或者是否有在form上配置verify=‘true’属性!");
                return false;
            }
            form = form[0];
            thsoft.validator.objects.form = form;
            formElements = [];
            for (var i = 0; i < form.length; i++) {
                eml = form.elements[i];
                //处理提交按钮
                if (eml.attributes[‘type‘] !== undefined && eml.attributes[‘type‘].value === ‘submit‘)
                    thsoft.validator.objects.submitBtns.push(eml);

                //todo 屏蔽掉button
                if ((eml.attributes[‘type‘] !== undefined && eml.attributes[‘type‘].value === ‘button‘) || eml.attributes[‘rule‘] === undefined || eml.attributes[‘rule‘].value === ‘‘)
                    continue;
                //todo 增加验证方法
                eml.onblur = function () { thsoft.validator.verify(this); };
                eml.onfocus = function () { thsoft.validator.showTip(this); };
                eml.onkeyup = function () { thsoft.validator.verify(this) };
                //todo 给对象创建提示
                thsoft.validator.newTip(eml);
                formElements.push(eml);
            }
            //设置提交按钮事件
            if (thsoft.validator.objects.submitBtns.length > 0)
                for (var i = 0; i < thsoft.validator.objects.submitBtns.length; i++) {
                    thsoft.validator.objects.submitBtns[i].onclick = function () {
                        return thsoft.validator.submit();
                    };
                }

            thsoft.validator.objects.formElements = formElements;

        },
        //todo 验证方法
        verify: function (el) {
            //todo 取出ignor属性 判断是否可为空
            ignor = (el.attributes[‘ignor‘] !== undefined && el.attributes[‘ignor‘].value === ‘true‘);
            //todo 取出value
            value = el.value;
            //todo 不是必填项 可为空
            if (value === ‘‘ && !ignor) {
                //todo 空值处理
                thsoft.validator.addErro(el, ‘null‘);
                return false;
            }

            rule = el.attributes[‘rule‘].value;
            //todo 判断定义的规则是否存在
            if (thsoft.validator.rule.hasOwnProperty(rule))
                //todo 存在就取出规则
                rule = thsoft.validator.rule[el.attributes[‘rule‘].value];

            //todo 没有在规则里面定义 也可以将规则写在rule属性里面

            //todo 如果rule定义的是函数
            if (rule instanceof Function) {
                if (!rule(value)) {
                    //todo 验证不通过处理
                    thsoft.validator.addErro(el, rule);
                    return false;
                }
            }
                //todo 规则为正则表达式的处理
            else {
                var reg = new RegExp(rule);

                if (!reg.test(value)) {
                    thsoft.validator.addErro(el, rule);
                    return false;
                }
            }
            thsoft.validator.removeErro(el);
            return true;
        },
        newTip: function (el) {

            //todo 根据当前时间生存ID 用于验证对象去取提示框的标记
            var currDate = new Date();
            var guid = "T" + (Math.random() / Math.random()) + currDate.getSeconds() + currDate.getMilliseconds();
            el.setAttribute(‘traget‘, guid);
            el.traget = guid;
            var position = thsoft.validator.getPosition(el);

            //todo 增加提示图标开始 图片使用16px
            var tipIcon = thsoft.dom.tools.createElement(‘div‘, {
                traget: guid,
                $width: ‘20px‘,
                $height: ‘20px‘,
                $position: ‘absolute‘,
                $background: thsoft.validator.config.tipType.info.icon,
                $padding: ‘0px‘,
                $left: (position.x + el.offsetWidth) + ‘px‘,
                $top: position.y + ‘px‘
            });
            thsoft.dom.tools.appendElement(_window.document.body, tipIcon);

            //将tipIcon 增加到thsoft.validator.objects.tipPanels中 便于验证时改变图标
            thsoft.validator.objects.tipIcons[guid] = tipIcon;

            //todo 设置提示图标悬停事件
            tipIcon.onmouseover = function (e) {
                thsoft.validator.showTip(this);
            };
            //todo 设置提示图标鼠标离开事件
            tipIcon.onmouseout = function (e) {
                //todo 隐藏提示框处理
                thsoft.validator.clerTip(this);
            };
            //todo 增加提示图标结束

            //todo 设置提示框的参数
            if (typeof parms === ‘object‘)
                for (var parm in parms)
                    thsoft.validator.objects.tipPanelParms[parm] = parms[parm];
            //在此设置参数防止在外边调用时修改
            thsoft.validator.objects.tipPanelParms[‘$font-size‘] = ‘13px‘;
            thsoft.validator.objects.tipPanelParms[‘id‘] = guid;
            thsoft.validator.objects.tipPanelParms[‘$left‘] = ((position.x + el.offsetWidth) + tipIcon.offsetWidth + 2) + ‘px‘;
            thsoft.validator.objects.tipPanelParms[‘$top‘] = position.y + ‘px‘;
            thsoft.validator.objects.tipPanelParms[‘$color‘] = thsoft.validator.config.tipType.info.foreColor;
            //设置提示消息
            tipMsg = el.attributes[‘tipmsg‘];

            if (tipMsg !== undefined)
                tipMsg = tipMsg.value;
            else {

                ignor = (el.attributes[‘ignor‘] !== undefined && el.attributes[‘ignor‘].value === ‘true‘);
                if (ignor)
                    tipMsg = thsoft.validator.tip.ignorMsg;
                else
                    tipMsg = "";
            }
            thsoft.validator.objects.tipPanelParms[‘innerHTML‘] = tipMsg;

            //todo 创建时默认隐藏
            thsoft.validator.objects.tipPanelParms[‘$display‘] = ‘none‘;
            //todo 设置提示框参数结束

            //todo 创建提示信息框开始
            var tipPanel = thsoft.dom.tools.createElement(‘div‘, thsoft.validator.objects.tipPanelParms);
            thsoft.dom.tools.appendElement(_window.document.body, tipPanel);
            thsoft.validator.objects.tipPanels[guid] = tipPanel;
            //todo 创建提示信息框结束

        },
        //todo 增加提示
        showTip: function (el, msg) {

            if (msg !== undefined && msg !== ‘‘)
                thsoft.validator.objects.tipPanels[el.attributes[‘traget‘].value].innerHTML = msg;

            if (el.attributes[‘traget‘] === undefined)
                return;

            thsoft.validator.objects.tipPanels[el.attributes[‘traget‘].value].style.display = ‘block‘;
        },
        //todo 清除提示
        clerTip: function (el) {
            thsoft.validator.objects.tipPanels[el.attributes[‘traget‘].value].style.display = ‘none‘;

        },
        addErro: function (el, rule) {
            el.pass = false;
            erroMsg = ‘‘;
            //todo 验证不通过处理
            //如果违反必填项约定
            if (rule === ‘null‘) {
                //取出空值提示消息
                erroMsg = el.attributes[‘nullmsg‘];
                if (erroMsg !== undefined)
                    erroMsg = el.attributes[‘nullmsg‘].value;
                else
                    erroMsg = thsoft.validator.tip.nullMsg;
            }
            else {
                //取出erromsg节点属性
                erroMsg = el.attributes[‘erromsg‘];
                //如果有配置erromsg属性 则取出值
                if (erroMsg !== undefined) {
                    erroMsg = el.attributes[‘erromsg‘].value;
                }
                else if (thsoft.validator.tip.hasOwnProperty(rule)) {
                    //如果没有则根据rule节点属性去tip对象去去
                    erroMsg = thsoft.validator.tip[rule];
                } else {
                    erroMsg = thsoft.validator.tip.erroMsg;
                }
            }

            //todo 设置当前元素的提示样式
            if (el.backColor == undefined && el.backColor !== thsoft.validator.config.erroColor)
                el.backColor = el.style.backgroundColor;

            el.style.backgroundColor = thsoft.validator.config.erroColor;
            thsoft.validator.objects.tipPanels[el.attributes[‘traget‘].value].style.color = thsoft.validator.config.tipType.erro.foreColor;
            thsoft.validator.objects.tipIcons[el.attributes[‘traget‘].value].style.background = thsoft.validator.config.tipType.erro.icon;
            thsoft.validator.showTip(el, erroMsg);
        },
        removeErro: function (el) {
            //todo 提交时判断元素的el.pass 不等于undefined 或者false 就验证通过
            el.pass = true;
            if (el.backColor !== undefined)
                el.style.backgroundColor = el.backColor;
            thsoft.validator.objects.tipIcons[el.attributes[‘traget‘].value].style.background = thsoft.validator.config.tipType.pass.icon;
            thsoft.validator.objects.tipPanels[el.attributes[‘traget‘].value].style.color = thsoft.validator.config.tipType.pass.foreColor;
            thsoft.validator.objects.tipPanels[el.attributes[‘traget‘].value].innerHTML = thsoft.validator.tip.pass;
            thsoft.validator.clerTip(el);
        },
        submit: function () {
            var formElements = thsoft.validator.objects.formElements;
            pass = true;
            for (var i = 0; i < formElements.length; i++) {
                if (!thsoft.validator.verify(formElements[i])) {
                    pass = false;
                    return false;
                }
            }

            if (thsoft.validator.objects.callback !== null)
                thsoft.validator.objects.callback();
            else
                return true;
        },
        //获取元素相对于浏览器的位置
        getPosition: function (el) {
            _x = 0, _y = 0;
            while (true) {
                //todo 由于  获取td tr的offsetTop 值都是一样  所以要过滤处理
                if (el.tagName == "TR") {
                    el = el.parentNode;
                    continue;
                }
                _x += el.offsetLeft;
                _y += el.offsetTop;

                if (el.tagName == ‘BODY‘)
                    break;
                el = el.parentNode;
            }
            return { x: _x, y: _y };
        }

    };

})(this); 

3.下面是测试用的html

<html>
<head>
    <title> New Document </title>

    <script src="Script/thsoft.tools/thsoft.dom.tools.js"></script>
    <script src="Script/thsoft.validator/thsoft.validator.tools.js"></script>
    <script type="text/javascript">
        window.onload = function () {
            thsoft.validator.init({
                submitBtn: ‘#submitBtn‘,
                rule: {
                    num: /^[0-9]*$/,
                    email: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
                },
                Msgs: {
                    num: ‘您输入的不是数字ya!‘,
                    email:‘你输入的邮箱格式不正确!‘
                }, callback: function () {
                    alert(‘已提交!‘);
                }
            });
        };
    </script>
</head>

<body style="padding:0px; margin:0px; height:2000px">
    <!--<iframe src="index2.html" style="margin-top:300px;margin-left:300px; width:900px"></iframe>-->
    <form id="myForm" verify="true">
        <div>index2</div>
        <input type="button" value="显示视频" style=" float:right" onclick="thsoft.video.tools.open()" />
        <input id="id0" rule="num" ignor="true" erromsg="你输入的地址长度不对!" style="height:100px">
        <table cellpadding="0" cellspacing="0" border="1" width="600" style="   margin:0px auto">
            <tbody>
                <tr>
                    <td>姓名</td>
                    <td>
                        <div><input style="width:200px;" id="cx" rule="name" tipmsg="请输入姓名!" erromsg="你输入的姓名格式不对!"></div>

                    </td>
                </tr>
                <tr>
                    <td>年龄</td>
                    <td> <input id="id1" rule="num" tipmsg="请输入年龄!" erromsg="你输入的不是数字!" nullmsg="年龄不能为空!"></td>
                </tr>
                <tr>
                    <td>Email</td>
                    <td> <div><input id="id2" tipmsg="请输入邮箱!" rule="email" nullmsg="邮箱不能为空!" ignor=" false"></div></td>
                </tr>
                <tr>
                    <td>地址</td>
                    <td> <div><input id="id3" rule="num" ignor="true"></div></td>
                </tr>
            </tbody>
        </table>
        <input type="submit" value="submit提交" /><input id="submitBtn" type="button" value="其他事件提交" />
    </form>
</body>
</html>  

另附上需要用到的图标:

如果需要 请适当修改js中的图片路径 以便正常使用

时间: 2024-10-12 21:44:18

纯 javascript 表单验证插件 ie 5,6,7,8,9,10 测试通过的相关文章

10个强大的Javascript表单验证插件推荐

创建一个JavaScript表单验证插件,可以说是一个繁琐的过程,涉及到初期设计.开发与测试等等环节.实际上一个优秀的程序员不仅是技术高手,也应该是善假于外物的.本文介绍了10个不错的JavaScript表单验证插件,使用它们完全可以节省你的时间!希望你喜欢. 1. validate.js Validate.js是一个非常不错的JavaScript表单验证库,源于CodeIgniter API.该库相当轻巧(不到1KB),不要求任何JavaScript框架,可以在所有主流浏览器中运行(包括IE

jQuery.validate.js表单验证插件

jQuery.validate.js表单验证插件的使用 效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-e

javaScript简单表单验证插件

 Validator = { Require : /.+/, Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,     Phone : /^(0[1-9][0-9]{1,2}-[1-9][0-9]{6,7})$/, Mobile : /^((\(\d{3}\))|(\d{3}\-))?1[3,5,8]\d{9}$/, Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[

JavaScript之jQuery-7 jQuery 使用插件(使用插件、日历插件、表单验证插件)

一.jQuery 使用插件 插件的查找与帮助 - jQuery 官方网站的插件库(http://plugins.jquery.com) 提供了大量的插件.并给出去了每个插件的用户评级.版本及bug等 - 库中列出了每个插件的ZIP文件下载.演示.示例代码及教程 使用插件 - step 1:将插件包导入到页面中,并确保它在jQuery源文件之后 <script src="jqeury-1.11.1.js"></script> <script></

jQuery html5Validate基于HTML5表单验证插件

一.前言 前3篇文章实际都是为本文做铺垫的,如果以下棋表示,前三篇是普通走棋,本篇是将军! 目前市面上有不少表单验证插件,看似强大,实在糟糕! 总结下,有以下一些问题: 过多干预包括:改变了表单元素UI, 为表单元素绑定过多事件等 布局等限制包括:需要特定结构的布局,需要特定的类名或者ID 学习成本包括:N多元作者自定义的属性,或者自定义的特定的数据结构 可用性 当JS出现错误的时候而无法正常运作的时候,验证就是聋子的耳朵——摆设,即使在现代浏览器下也是如此. 面向未来的表单验证 验证驱动验证信

好用的表单验证插件

在做项目过程中,使用了jquery的一个验证表单的插件--jquery validation.这里简单整理了一下这个强大的表单验证插件的一些常用的方法,以及在使用过程中需要注意的地方. 首先要想使用,首先需要引入jquery,然后引入jquery validation两个文件.然后通过插件的初始化方法,进行初始化,之后就可以按照自己的需要进行使用了. //引入jquery,版本1.6+ <script type="text/javascript" src="http:/

【jQuery基础学习】06 jQuery表单验证插件-Validation

jQuery的基础部分前面都讲完了,那么就看插件了. 关于jQuery表单验证插件-Validation validation特点: 内置验证规则:拥有必填.数字.E-Mail.URL和信用卡号码等19类内置验证规则 自定义验证规则:可以很方便地自定义验证规则 简单强大的验证信息提示:默认了验证信息提示,并提供了自定义覆盖默认提示信息的功能 实时验证:可以通过keyup或者blur事件触发验证,而不仅仅在表单提交的时候验证 使用方法: 引用jQuery库和Validation插件 <script

jQuery表单验证插件----通过name属性来关联字段来验证,改变默认的提示信息,将校验规则写到 js 代码中

一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二. 添加一个另外一个插件jquery.validate.messages_cn.js. 改变默认提示方式. 三.jQuery表单验证插件----通过name属性来关联字段来验证,将校验规则写到 js 代码中. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.

自己编写的表单验证插件

自己编写了一个表单验证插件,使用起来很简单,以后还可以扩展更多的功能,比如ajax验证. 思路借鉴了wojilu框架.每个需要验证的表单元素下面有一个span标签,这个标签的class有一个valid表示需要验证,如果有nullable则表示可为空:rule表示验证规则,msg表示错误提示信息:to表示要验证的元素的name值,如果元素是单个的,to可以不写.该插件会遍历每个有valid的span标签,找出它前面需要验证的元素,根据rule验证,如果验证不通过,则显示边框为红色,鼠标放在元素上时