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