如何在用户使用Jquery输入时暂停一个AJAX请求?

时间:2009-12-28 03:56:43

标签: php javascript jquery ajax

当用户输入内容时,我需要使用AJAX检查数据库中相应数据的用户输入,但我不能连续检查用户输入数据库中的数据,因为这会压倒我的数据库服务器。我只想在用户输入期间以显着/明显/明智的暂停开始AJAX请求。例如,输入光标不会移动一秒或两秒。从用户的角度来看,他认为检查是实时的。如何使用Jquery做到这一点?

为什么我的代码不按预期工作?

function subjectivecheck(id){
    alert(id);
    var cost=(new Date().getTime() - start.getTime())/1000;
    var value=$('#question'+id).val();
    $.post("subjectivecheck.php?",{val:value, qid:id,time:cost, a_id:"<?php echo $announcementid; ?>"},function(xm){

        switch(parseInt(xm)){
            case 4:
            { $htm='Congrats,you have passed the test.';
                $('#success').css({"color":"green"});
                $('#success').text($htm);
            return; 
            }
            case 1:
            {
            $htm='V';
        $('#sign'+id).css({"color":"green"});
        $('#sign'+id).text($htm);
        break;  
            }
            case 0:{

                 $htm='X';
        $('#sign'+id).css({"color":"red"});
        $('#sign'+id).text($htm);
        break;
            }
            case 3:{
                $('#subjectivequestion').text('You have failed at this announcement.');

                $('#choicequestions').text(" ");
            }
        }

    });

}
var ajaxCallTimeoutID = null;
function subjectivecheckcallback(id){
    if (ajaxCallTimeoutID != null)
    clearTimeout(ajaxCallTimeoutID);

  ajaxCallTimeoutID = setTimeout(subjectivecheck(id), 1000);

}

3 个答案:

答案 0 :(得分:3)

基本上,您希望在用户上次输入后的某个时间启动AJAX调用。如果您使用的是文本框,则可以通过处理keyup事件并使用setTimeout()安排AJAX调用来执行此操作。在事件处理程序开始时,您可以检查预定的呼叫并取消它(因为用户再次开始输入):

var ajaxCallTimeoutID = null;
function doAjax() {
  // Do AJAX call here...
}

$('#myTextbox').keyup(function(ev) {

  if (ajaxCallTimeoutID != null)
    clearTimeout(ajaxCallTimeoutID);

  ajaxCallTimeoutID = setTimeout(doAjax, 300);
});

如果您想对整个表单中的用户输入做出反应,那么您只需要扩展处理程序处理的事件。您可能希望为文本框,textareas和选择元素处理keyup,为选择元素处理change,并在所有内容上处理focus

答案 1 :(得分:1)

我使用以下函数,它基本上在用户停止输入指定时间后执行回调:

var typewatch = function(){
    var timer = 0;
    return function(callback, ms){
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    }  
}();

<强>用法:

$('input').keyup(function() {
    typewatch(function(){
      alert('Time elapsed, make Ajax request...');
    }, 1000 ); // wait one second
});

您可以查看jQuery Typewatch插件,了解更复杂的内容。

答案 2 :(得分:0)

只需启动一个合理延迟的计时器:

var delaying = false;

function doAjax() {
  // ... begin Ajax
  delaying = false;
}

$('#myTextbox').keyup(function(ev) {
  if (!delaying) {
    delaying = true;
    setInterval(doAjax, 3000);
  }
});