• web页面数据验证提醒方式


    虽然现在MVC比较热, 但是使用Web Form方式进行开发的项目应该还有很多,这就少不了使用验证控件,但是验证控件在验证不通过时,提醒的方式很简单,不够友好。如果页面布局是流布局方式,很容易因为显示出来的错误信息造成布局混乱。AjaxControlToolkit的ValidatorCallout虽然可以很好,但是需要为每一个验证控件要再加多一个控件, 在实际使用中太麻烦了,于是分析了ValidatorCallout的原理后,自己来实现一个更好用的ValidatorCallout

    原理: 每一个验证控件最后都会在页面中生成相应的元素,并有一个

    evaluationfunction属性,这个方法会在验证的时候被调用,
    AjaxControlToolkit中就是通过重写这个方法来达到提示的目的。
             //               
            // Override the evaluation method of the current validator
            //
            if(elt.evaluationfunction) {
                
    this._originalValidationMethod = Function.createDelegate(elt, elt.evaluationfunction);
                
    this._validationMethodOverride = Function.createDelegate(thisthis._onvalidate);
                elt.evaluationfunction 
    = this._validationMethodOverride;            
            }

     新的

    ValidatorCallout实现方式与这个类似,由于所有的验证控件都在
    Page_Validators这个数组中,这个是由验证控件自动生成的,所以应该不用再给每一个验证控件都再加一个控件,只引用相应的脚本就可以了,不用添加修改任何代码。

     实现方式:

      

    var ValidatorCallout = function(validator) {    

        if (typeof (validator) =='string')

            this._validator = document.getElementById(validator);
        
    else
            
    this._validator = validator;

        
    this._validator.display = 'None'//the error message will not show when validate

        
    if (typeof (validator.controltovalidate) == 'string') {
            
    this._validatorControl = document.getElementById(validator.controltovalidate);
        }
        
    else {
            
    this._validatorControl = null;
        }
    }

    ValidatorCallout.zIndex 
    = 999;

    ValidatorCallout.prototype 
    = {

        initiate: 
    function() {
            
    var divContainer = $('<div id="' + 'Validator_divContainer' + ValidatorCallout.zIndex + '"></div>')
            .addClass(
    'tip_Container').css('zIndex', ValidatorCallout.zIndex++)
             .click(
    function() {
                 $(
    this).css('zIndex', ValidatorCallout.zIndex++);
             });

            
    this._divContainer = divContainer[0];

            
    var divCorner = $('<div></div>').addClass('tip_Corner').appendTo(divContainer);

            
    var count = 10;
            
    if ($.browser.msie == true && $.browser.version == '6.0') {
                count 
    = 5/* special for ie 6.0 */
            }
            
    for (var i = 0; i < count; i++) {
                $(
    '<div></div>').css('width', i + 'px')
                .addClass(
    'tip_Corner_Line').appendTo(divCorner);
            }

            
    var divPanel = $('<div></div>').addClass('tip_Panel').appendTo(divContainer);

            $(
    '<span></span>').addClass('tip-message')
            .text(
    this._validator.errormessage == null ? '' : this._validator.errormessage)
            .appendTo(divPanel);

            $(
    '<div></div>').addClass('tip_close').appendTo(divPanel)
            .click(
    function() {
                divContainer.css(
    'display''none');
            });

            $(
    'body').append(divContainer);

            
    this._validator.callout = this;

            
    //over write the validator.evaluationfunction to new funtion
            if (typeof (this._validator.evaluationfunction) == 'String') {
                
    this._validator.evaluationfunction = eval(this._validator.evaluationfunction);
            }

            
    var evaluationfunction = this._validator.evaluationfunction;
            
    this._validator.evaluationfunction = function(val) {
                
    if (!evaluationfunction(val)) {
                    ValidatorCallout.show(val);
                    
    return false;
                }
                
    else {
                    ValidatorCallout.hide(val);
                    
    return true;
                }
            };

            $(
    this._validatorControl).unbind('focus', ShowErrorMessageWhenFocus)
            .bind(
    'focus', ShowErrorMessageWhenFocus);
        }

    };

    ValidatorCallout.show 
    = function(validator) {
        
    if (validator.callout._validatorControl != null) {

            
    var ctlValidator = $(validator.callout._validatorControl);
            ctlValidator.addClass(
    "error");

            
    var errorPopupId = validator.callout._divContainer.id;
            
    if (ctlValidator.attr('validator'== null || ctlValidator.attr('validator'== '') {
                ctlValidator.attr(
    'validator', errorPopupId);
            }

            
    //only show the first error when multiple validator validate one control
            if (ctlValidator.attr('validator'== errorPopupId) {
                ShowErrorMessage(ctlValidator, validator.callout._divContainer);
            }
        }
    }

    ValidatorCallout.hide 
    = function(validator) {
        $(validator.callout._divContainer).css(
    'display''none');

        
    if (validator.callout._validatorControl != null) {
            
    var ctlValidator = $(validator.callout._validatorControl);
            
    if (ctlValidator.attr('validator'== validator.callout._divContainer.id) {
                ctlValidator.removeClass(
    'error');
                ctlValidator.removeAttr(
    'validator');
            }
        }
    }

    function ShowErrorMessageWhenFocus(e) {
        
    var ctlToValidate = $(this);
        
    var messageDivId = ctlToValidate.attr('validator');
        
    var messageDiv = $('#' + messageDivId);
        ShowErrorMessage(ctlToValidate, messageDiv);
    }

    function ShowErrorMessage(validatorControl, messageContainer) {
        
    var ctlValidator = $(validatorControl);
        
    var position = ctlValidator.position();
        position.top 
    += ctlValidator.outerHeight(true- 10;
        $(messageContainer)
             .css({
                 
    'width': ctlValidator.width()
                 , 
    'left': position.left
                 , 
    'top': position.top
                 , 
    'display''block'
             });

        
    //setTimeout("HideObject('" +$(messageContainer).attr("id") + "');", 2500); 
    }

    function HideObject(elemId) {
        $(
    '#' + elemId).css('display''none');
    }

    jQuery(
    function($) {
        
    if (typeof (Page_Validators) != 'undefined') {
            
    for (var i = 0; i < Page_Validators.length; i++) {
                
    var validatorCall = new ValidatorCallout(Page_Validators[i]);
                validatorCall.initiate();
            }
        }

    });

    要点:

    jQuery(function($) {
        
    if (typeof (Page_Validators) != 'undefined') {
            
    for (var i = 0; i < Page_Validators.length; i++) {
                
    var validatorCall = new ValidatorCallout(Page_Validators[i]);
                validatorCall.initiate();
            }
        }

    });

     在页面加载的时候,将 Page_Validators中的验证控件取出来创建validatorCallout,然后调用

    initiate方法创建提示控件,将它的evaluationfunction修改成新的包装后的方法,实现方式:
            var evaluationfunction = this._validator.evaluationfunction;
            
    this._validator.evaluationfunction = function(val) {
                
    if (!evaluationfunction(val)) {
                    ValidatorCallout.show(val);
                    
    return false;
                }
                
    else {
                    ValidatorCallout.hide(val);
                    
    return true;
                }

             }; 

            

    关键方法:  

    initiate: 初始化控件,并创建相应的提示信息元素

    show: 显示错误提示信息

    hide: 隐藏错误信息 


    使用方法:在页面中加入JS脚本和CSS文件就可以了。(另外需要引用jQuery脚本文件)

    下载:  ValidatorCallout.rar 

     效果大家试一下就知道了。

  • 相关阅读:
    监听属性改变defineProperty和文档碎片createDocumentFragment
    this指向bind、call、apply
    css mask文字渐变+clip-path裁剪路径+border-image图片边框
    浅谈 Hybrid App
    activiti与flowable的区别(转)
    JAVA:定时器的三种方法(详细注解)
    Activiti5
    别再写满屏的try-catch了,真丑,全局异常处理不会吗?(转)
    共享锁、排他锁、互斥锁、悲观锁、乐观锁、行锁、表锁、页面锁、不可重复读、丢失修改、读脏数据...(转)
    什么是跨域?跨域解决方法(转)
  • 原文地址:https://www.cnblogs.com/zq8024/p/2095859.html
Copyright © 2020-2023  润新知