2013-10-23 64 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