2013-08-04 61 views
2

我有以下的jQuery代碼監聽到的驗證碼,用戶輸入併發送每個KEYUP一個Ajax請求,看是否正確的代碼已經被鍵入:jQuery的KeyUp事件與AJAX導致不正確的結果

$('#joinCaptchaTextBox').keyup(function() { 
    $.get('scripts/ajax/script.php', { 
     'join_captcha': '1', 
     'captcha': $('#joinCaptchaTextBox').val()},   
     function(data) { 
      var obj = JSON.parse(data); 
      if(obj.ajaxResponse.status) { 
       $('#joinCaptchaNotAcceptable').hide(); 
       $('#joinCaptchaAcceptable').show(); 
      }else{ 
       $('#joinCaptchaAcceptable').hide(); 
       $('#joinCaptchaNotAcceptable').show(); 
      } 
    }); 
}); 

在另一端的PHP腳本只是檢查了會議,並回答說:

if($siteCaptcha == $_SESSION['secretword']) { 
    $this->captchaCompare = TRUE; 
}else{ 
    $this->captchaCompare = FALSE; 
} 

這工作的時間細95%,但我發現有時報告輸入驗證碼是即使其正確不正確。我認爲這可能是因爲當快速輸入時,很多請求被髮送到服務器,並且返回的訂單或請求不是發送的訂單,因此(因爲只有一個將是正確的)之前的一個會最後收到並顯示不正確。

有沒有更好的方法來做到這一點?有沒有辦法確保上次發送的請求最後收到?有什麼我在這裏失蹤。我可以提供更多信息。

三江源

+0

這將幫助,因爲它會引入等待/延遲https://開頭的github .com/dennyferra/TypeWatch –

+0

這是一個壞主意;這意味着一個腳本只需要發送大約25 *個字符*最多*來強制你的驗證碼。換句話說,你會收到垃圾郵件。 – Dave

+0

好吧不是那麼糟糕;我以爲你正在檢查文字*到目前爲止*。但這仍然非常糟糕。如果你弄錯了,每個你所見過的CAPTCHA都會有新的改變。計算機視覺能夠縮小可能的字母,並且如果允許多次猜測(可以這樣做),那麼強力可以應用於其餘的可能性。 – Dave

回答

3

添加了超時,從而在每個KEYUP不發送請求當用戶鍵入快捷:

$('#joinCaptchaTextBox').on('keyup', function() { 
    clearTimeout($(this).data('timer') ); 
    $(this).data('timer', 
     setTimeout(function() { 
      var data = { 
        join_captcha: '1', 
        captcha : $('#joinCaptchaTextBox').val() 
      }; 

      $.ajax({ 
       url : 'scripts/ajax/script.php', 
       data: data, 
       dataType: 'json' 
      }).done(function(result) { 
       $('#joinCaptchaNotAcceptable').toggle(!result.ajaxResponse.status); 
       $('#joinCaptchaAcceptable').toggle(result.ajaxResponse.status); 
      }); 
     },500) 
    ); 
}); 
+0

非常感謝...謝謝:) – user1105192