如何在用户上次输入后的某个时间启动包含AJAX请求的功能?

时间:2009-12-28 15:38:35

标签: jquery ajax

这是至关重要的代码:

var ajaxCallTimeoutID = null;
$(document).ready(function() {
 $("input[id^='question']").live('keyup',function(ev){
    id=this.id.substr(8);
    if (ajaxCallTimeoutID != null)
    clearTimeout(ajaxCallTimeoutID);
ajaxCallTimeoutID = setTimeout(subjectivecheck(id), 1000);

}); 
});

然而,

  

subjectivecheck(ID)   当用户输入一个字母时立即执行,但我希望在用户停止输入指定的时间后调用它。如何解决这个问题?

function subjectivecheck(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(" ");
            }
        }

    });

}

2 个答案:

答案 0 :(得分:2)

您需要将其包装在匿名函数中:

ajaxCallTimeoutID = setTimeout(function(){subjectivecheck(id)}, 1000);

如果没有包装function(){},函数subjectivecheck会立即被调用,但是当你将它包装起来时,你会将对函数的引用作为参数传递。之后可以调用该函数,然后调用您的函数。

答案 1 :(得分:0)

我通常做的是在keyup上启动超时,并清除keydown(或keypress)上的超时。

var timers=[];
$('input[id^="question"]').keydown(function(){
  while(timers.length){
    clearTimeout(timers.shift());
  }
}).keyup(function(){
  var timeout=setTimeout(function(){
    //ajax call here
  }, 300);
  timers.push(timeout);
});