这是至关重要的代码:
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(" ");
}
}
});
}
答案 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);
});