Php 如何在用户使用Jquery输入过程中的重要停顿处启动AJAX请求?

Php 如何在用户使用Jquery输入过程中的重要停顿处启动AJAX请求?,php,javascript,jquery,ajax,Php,Javascript,Jquery,Ajax,当用户输入某些内容时,我需要使用AJAX对照数据库中相应的数据检查用户输入,但我不能连续对照数据库中的数据检查用户输入,因为这会使我的数据库服务器无法正常工作。我只想在用户输入过程中的一个重要/明显/合理的暂停处启动一个AJAX请求。例如,输入光标在一两秒钟内不会移动。从用户的角度来看,他认为检查是实时的。如何使用Jquery实现这一点 为什么我的代码不能按预期工作 function subjectivecheck(id){ alert(id); var cost=(new Da

当用户输入某些内容时,我需要使用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);

}
函数主观性检查(id){
警报(id);
var cost=(new Date().getTime()-start.getTime())/1000;
var值=$('#问题'+id).val();
$.post(“subjectivecheck.php?”,{val:value,qid:id,time:cost,a_id:”“},函数(xm){
开关(parseInt(xm)){
案例4:
{$htm='恭喜你,你通过了考试。';
$('#success').css({“color”:“green”});
$('success').text($htm);
返回;
}
案例1:
{
$htm='V';
$('#sign'+id).css({“color”:“green”});
$('#符号'+id).text($htm);
打破
}
案例0:{
$htm='X';
$('#sign'+id).css({“color”:“red”});
$('#符号'+id).text($htm);
打破
}
案例3:{
$(“#主观性问题”).text('您在此次公告中失败');
$(“#选择问题”)。文本(“”);
}
}
});
}
var ajaxCallTimeoutID=null;
函数主体检查回调(id){
如果(ajaxCallTimeoutID!=null)
clearTimeout(ajaxCallTimeoutID);
ajaxCallTimeoutID=setTimeout(主观性检查(id),1000);
}

基本上,您希望在用户上次输入后的某个时间启动AJAX调用。如果您使用的是文本框,那么可以通过处理
keyup
事件并使用
setTimeout()
安排AJAX调用来实现。在事件处理程序的开始处,您可以检查计划调用并取消它(因为用户再次开始键入):


如果希望对整个表单中的用户输入做出反应,那么只需扩展处理程序处理的事件。您可能希望为文本框、文本区域和选择元素处理
键控
,为选择元素处理
更改
,并可能
关注所有事情。

只需启动一个定时器,以获得合理的延迟:

var delaying = false;

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

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

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

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插件以了解更复杂的内容。

为什么我的代码不能按预期工作?每次输入新字母时都会执行Ajax函数。
setTimeout()
的第二个参数指定延迟(以毫秒为单位)。我的示例将其设置为300ms,因此它发生得非常快(适用于自动完成查找,可能不适用于您的目的)。尝试将该值更改为3000(3秒)左右。
$('input').keyup(function() {
    typewatch(function(){
      alert('Time elapsed, make Ajax request...');
    }, 1000 ); // wait one second
});