我让用户在打字时进行ajax调用。问题是它会调用每个字母的输入,所以我设置了这样的超时:
$(input).live('keyup', function(e){
setTimeout(function(){
var xx = $(input).val();
doSearch(xx);
}, 400);
});
确实等待了400ms,然后为每个keyup执行。如何在最后输入的字母后约400ms时更改此选项以使ajax调用“一次”?
(我过去使用过'延迟',但这对我的脚本根本不起作用......)
答案 0 :(得分:19)
timer = 0;
function mySearch (){
var xx = $(input).val();
doSearch(xx);
}
$(input).live('keyup', function(e){
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(mySearch, 400);
});
最好将你的函数移动到一个命名函数并多次调用它,因为否则你会在每个keyup上创建另一个lambda函数,这是不必要且相对昂贵的
答案 1 :(得分:4)
每次按下新键时都需要重置计时器,例如
(function() {
var timer = null;
$(input).live('keyup', function(e) {
timer = setTimeout(..., 400);
});
$(input).live('keydown', function(e) {
clearTimeout(timer);
});
)();
函数表达式用于确保timer
变量的范围仅限于需要它的那两个函数。
答案 2 :(得分:0)
我认为只要你是o.k,你就可以再次使用delay()
。添加一个新的临时“东西”混合。这对你有用吗?
$(input).live('keyup', function(e) {
if (!$(input).hasClass("outRunningAJob")) {
var xx = $(input).val();
$(input).addClass("outRunningAJob");
doSearch(xx);
$(input).delay(400).queue(function() {
$(this).removeClass("outRunningAJob");
$(this).dequeue();
});
}
});
答案 3 :(得分:0)
我发现以下内容更容易实现:
$(input).on('keyup', function () {
delay(function () {
if (input).val() !== '' && $(input).val() !== $(input).attr('searchString')) {
// make the AJAX call at this time
// Store the value sent so we can compare when JSON returns
$(input).attr('searchString', $(input).val());
namepicker2_Search_Prep(input);
}
}, 500);
});
通过存储当前字符串,您可以看到用户已停止输入。然后,您可以安全地调用您的函数来执行处理需要发生的事情。