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