2014-11-21 57 views
1

問題
我使用Ajax時用戶停止寫入驗證輸入,
基本上能正常工作,
但是當用戶想要寫的時候AJAX未完成,它不會讓他或其寫入這個輸入的速度非常慢。
AJAX驗證輸入,使輸入不可寫入的狀態或難寫

下面是一些小提琴:http://jsfiddle.net/qgnjoLch/

var myInterval; 
var typingTimer;    //timer identifier 
var doneTypingInterval = 700; //time in ms 
var doneTypingThis = false; 

$('#something').keyup(function(){ 
    typingTimer = setTimeout(function() {doneTyping('something');}, doneTypingInterval); 
    if(!doneTypingThis){ 
     //some functionality 
    }else { 
     doneTyping('something'); 
    } 
}); 

//reset timer 
$('#something').keydown(function(){ 
    clearTimeout(typingTimer); 
}); 

// User finished do something 
function doneTyping (input_id) { 

         var txt = ''; 
         var xmlhttp = new XMLHttpRequest(); 
         xmlhttp.onreadystatechange = function(){ 
          if(xmlhttp.status == 200 && xmlhttp.readyState == 4){ 
          txt = xmlhttp.responseText; 
          } 
         }; 
         xmlhttp.open("GET","catalog/view/javascript/mails.js",true); 
         xmlhttp.send(); 
         console.log($.parseJSON(txt)); 

         $.ajax({ 
          url: 'http://something.com/index.php?route=doesnot/really/matter', 
          type: 'post', 
          async: false, 
          data: 'email=' + $("#"+input_id).val(), 
          dataType: 'json', 
          success: function(json) { 
           if(json == "1") { 
            ajaxValid = false; 
           }else if(json == "2"){ 
            ajaxValid = false; 
           } else if(json == "0") { 
            ajaxValid = true; 

           }        
          } 
         }); 
         return ajaxValid; 
} 

回答

1

它becouse此行async: false,它改變的請求是同步的,而瀏覽器將是frozen,直到反應會來。要解決它,只需刪除這一行。然後你需要返回AJAX成功函數的結果(不是在它之後),但是你的代碼需要進行深度修改,因爲如果請求是異步的,那麼你的函數會在響應結束之前返回。

+0

這條線有一個重要的原因,形式不會發送,在阿賈克斯之前返回的東西... – JTC 2014-11-21 15:44:16

+0

我知道,我寫了解釋。如果您決定使用同步請求,則會導致您的瀏覽器停止響應,直到出現響應,這會導致性能問題。 – 2014-11-21 15:46:46

+0

還有一種方法可以通過在setTimeout()中保留整個驗證函數來完成異步操作() – 2014-11-21 15:48:49