2013-10-23 70 views
0

我被困在一个问题,其中一个标志没有得到正确重置。验证标志失败jquery

我有以下代码。我正在编写特定于IE8的代码。在字段模糊时,它遍历字段的类,如果任何类验证返回false,则应显示错误并设置为flag4=false。然后点击提交按钮,它需要检查所有标志是否为真,如果是,则返回true。

但现在,on blur正在发生。如果任何验证失败,则显示错误,稍后如果我们将错误更改为正确格式,则显示为绿色。但flag4总是返回false。由于它总是返回false,因此表单永远不会成功提交,用户也无法移动到下一页。我的问题是,我应该在哪里重置flag4的值?

我已经尝试了很多选项,但点击按钮失败。一旦flag4=false,即使正确地提供了所有字段后,它也不会变为真。

var flag4 = true; 
if(navigator.appVersion.indexOf("MSIE 8.0") != -1) { 
    var firsttime=false; 
    var validators = { 
     fn1: function(val) { 
      //return true or false; 
     }, 
     fn2: function(val) { 
      //return true or false; 
     } 
    }; 

    $('#submit_form :input').not('#id1,#id2,#id3').blur(function() { 
     var input = $(this); 
     var returnVal1 = true; 
     input.next('div.error_text').remove(); 
     input.removeClass('highlight'); 
     // Get all the classes of the current input 
     if(this.className) { 
      var classes = this.className.split(/\s+/); 
      for(var p in classes) { 
       if(classes[p] in validators) { 
        returnVal1 = returnVal1 && validators[classes[p]] (input.val()); 
       } 
      } 
     } 

     if(returnVal1 == false) { 
      firsttime=true; 
      $(this).removeClass('green'); 
      $(this).addClass('highlight'); 
      var $msg = $(this).attr('title'); 
      input.after('<div class="error_text">'+$msg+'/div>'); 
      flag4 = false; 
     } 

     if(returnVal1 == true && firsttime == true) { 
      input.addClass('green'); 
     } 

    }); 
} 

$('#submitbtn').click(function() { 
    var flag1, flag2, flag3 = true; 
    if(flag1 && flag2 && flag3 && flag4) { 
     returnvalue = true; 
    } else{ 
     returnvalue = false; 
    } 
    return returnvalue; 
}); 

如果任何验证当用户进入第一次返回false,firsttime=true。用户第二次输入正确的值时,该字段应变为绿色。对于我使用if(returnVal1 == true && firsttime == true)

+0

记录你用console.log()得到的结果可能会产生一些影响 – Ashalynd

+0

我试图alert()。但是,一旦flag4 = false,即使正确给出所有字段后,它也不会变为真。 – user1049057

+0

你的代码中'flag4'设置为'true'的唯一地方就是声明它的地方,而且这行只能执行一次。你需要在你的事件处理程序的某个地方将'flag4'设置回'true',但是如果你的模糊处理程序可以被调用多个元素,但只测试当前元素,那么这些元素如何共享相同的标志? – nnnnnn

回答

0

像@nnnnnn在评论中说,该flag4被设置为true的唯一地方是在变量声明。但是为什么不将它添加到onblur函数的开头,然后它将被设置为true,除非它被别的东西设置为false,即出现错误并将其设置为false

$('#submit_form :input').not('#id1,#id2,#id3').blur(function() { 
     flag4 = true; 
     // ... 
}); 
+0

嗨,Joshua。感谢您的回复。但是,如果我使flag4 = true,如您所提及的那样if(returnVal1 == false){ // ... flag4 = false;其他{ // ... flag4 = true; }那么如果第一个字段验证是假的,第二个字段验证是真的。然后它会进入下一个页面,即使认为第一个字段的验证是不正确的。希望你明白我想说什么 – user1049057

+0

这可能是一个问题是你如何设置'returnVal1'。在那种情况下,试试我的第一个建议。 – josh

+0

嗨,Joshua..I试着让你的flag4 = true在模糊函数之下,正如你所说的。即使如此,如果一个第一个字段为假,而第二个字段为true,它将覆盖flag4 = false,并始终返回true,而不管错误如何。 – user1049057