所以我有一些代码用于即时搜索:
$(function() {
var timer;
$("#searchterm").on('keypress',function() {
timer && clearTimeout(timer);
timer = setTimeout(doStuff, 800);
timer = setTimeout(more, 3600);
});
});
基本上,会发生的事情是代码检测到用户何时停止输入并触发doStuff
函数,该函数会加载显示结果的所有ajax。 more
函数应该检测用户何时滚动到结果的末尾,并使用ajax函数加载下一个批处理,但如果用户键入请求,则暂停并输入更多内容,就像页面一样加载,它似乎导致more
函数不止一次触发,当用户滚动到结果的末尾时,导致下一个结果加载两次,有时甚至更多,这使得页面冻结和生成一个非常长的结果列表。我试过了
在more
函数加载之前延长延迟,但这并不能完全解决问题。
有什么建议吗?
答案 0 :(得分:1)
您是否需要为计时器创建更多变量?现在,您似乎将more
的计时器分配给与doStuff
的计时器相同的变量,因此它会覆盖doStuff
的计时器。
可能是这样的:
$(function() {
var doStuffTimer, moreTimer;
$("#searchterm").on('keypress',function() {
doStuffTimer && clearTimeout(doStuffTimer);
doStuffTimer = setTimeout(doStuff, 800);
moreTimer && clearTimeout(moreTimer);
moreTimer = setTimeout(more, 3600);
});
});
答案 1 :(得分:0)
我认为您的问题是由于您没有正确清除timer
这一事实造成的。我会做这样的事情:
<强> HTML 强>
<div>
<input id="stop">
</div>
<强> JS 强>
var timer;
$("#stop").keyup(function(){
$("div").css("background-color", "white");
clearTimeout(timer);
timer = setTimeout(more, 2500);
}).keyup();
var more = function(){
$("div").css("background-color", "red");
}
这会清除最初设置的timer
计时器。如果您想对页面进行调整,那么当您滚动到页面底部时,可以执行timer = setTimeout(#dosomething, timeHere)
调用。然后,您需要一个事件处理程序,在用户开始输入时清除并重置计时器。