【问题标题】:How do I fix two bugs for my jQuery form Validation code?如何为我的 jQuery 表单验证代码修复两个错误?
【发布时间】:2013-07-23 21:49:46
【问题描述】:

如果字段无效,我的代码基本上会添加一个类错误,如果该字段有效,则会删除错误类并正常提交表单。

我无法找出我创建的表单验证代码的两个小错误。

下面列出的错误:

1) 如果您在一个字段中输入正确的内容,然后单击提交,则错误类别的长度不会在第一次提交单击时更新。更新长度需要两次提交点击。 (查看console.log)

2)如果您更改输入字段的内容并单击提交(一切正常,错误类已删除)但如果您决定删除更新的文本并将该字段留空,则错误类不会重新获得已申请。

如果我能得到一些帮助来解决这个问题,那就太好了。

如果有什么不清楚的地方请告诉我。

提前致谢: JSFIDDLE

$('form.requiredFields').submit(function(e) {

    var req = $(this).find('.req'),
        validateEmail = function(email) {
            var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
            return re.test(email);
        };

    req.each(function() {
        var $this = $(this),
            defaultVal = $this.prop('defaultValue'); //cache default val

        //checks for validation errors
       if (  ( $this.hasClass('email') && !validateEmail( $this.val() ) ) ||
             ( defaultVal === $this.val() || $this.val() === '' || $this.val().length < 3 )
       ) 
       {
          $this.addClass('error');
       } else {
          $this.removeClass('error req');
       }

    });

    console.log(req.length);

    if ( req.length === 0 ) {
        return true;
    } else {
        return false;
    }

}); 

【问题讨论】:

    标签: javascript jquery forms validation


    【解决方案1】:

    就像 dc5 对 #2 所说的那样,不要删除 req 类。

    对于 #1 - 您正在查找错误 (.req),然后再将其删除。

    看到这个工作fiddle。这是您的代码如何工作的示例,但也许您可以找到更简洁的解决方案。

    $('form.requiredFields').submit(function(e) {
    
        var req = $(this).find('.req'), errorCheck = 0,
            validateEmail = function(email) {
                var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
                return re.test(email);
            };
    
        req.each(function() {
            var $this = $(this),
                defaultVal = $this.prop('defaultValue'); //cache default val
    
            //checks for validation errors
           if (  ( $this.hasClass('email') && !validateEmail( $this.val() ) ) ||
                 ( defaultVal === $this.val() || $this.val() === '' || $this.val().length < 3 )
           ) 
           {
              $this.addClass('error');
           } else {
              $this.removeClass('error');
           }
    
        });
    
        errorCheck = $(this).find('.error');
        console.log(errorCheck.length);
    
        if ( errorCheck.length === 0 ) {
            return true;
        } else {
            return false;
        }
    
    });
    

    【讨论】:

    【解决方案2】:

    对于#2,在清除错误时,您正在移动“req”类和“error”类。下一次通过调用,输入不再通过你的选择器$(this).find('.req')找到

    对于#1 - 我不明白你所描述的问题。

    【讨论】:

    • 感谢 dc5 关于 #2 错误的意见。以后绝对不会犯这种错误。
    【解决方案3】:

    我让你更容易了,实际上你的代码是一团糟,

    这是一个小提琴:

    Jsfiddle validate Demo

    代码:

    $('#submit_form').click(function() {
        var flag = 0;
        var count = 0,
            total = $(".req").length;
        var validateEmail = function(email) {
        var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
                return re.test(email);
            }      
        $('.req').each(function(){
            count++; 
            if($(this).attr('id')=='email') {
                if(!validateEmail($(this).val())){ $(this).addClass('error');  flag = 1; } 
                    else { $(this).removeClass('error'); } }
    
            if($(this).attr('id')=='name') {
                if($(this).val().length < 3){ $(this).addClass('error');  flag = 1; } 
                    else { $(this).removeClass('error'); } }
    
            if($(this).attr('id')=='com') {
                if($(this).val().length < 3&&$(this).val()!=''){ $(this).addClass('error');  flag = 1; } 
                else { $(this).removeClass('error'); } }
    
            if ( total==count&&flag<1) { alert('submit'); }
        });
    });
    

    验证规则

    1. name - 必须大于 2。
    2. 电子邮件 - 模式匹配功能为真。
    3. 注释 - 如果输入,必须大于 2 个字符(只是为了了解如何完成)。

    如果这个示例不清楚或者您需要更多帮助,请不要犹豫……我很无聊。

    【讨论】:

    • 嘿 Shomi,非常感谢您的意见。我最初有像你的代码这样的乘法语句,但是当网站有多种形式非常长的形式时,它就会失控。这就是为什么我创建了自己的方法来应用 req 类并自动验证所有内容。
    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2013-12-09
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多