我正在研究类似自动完成的功能,但不完全相同。主要区别在于ajax返回的匹配值显示在单独div中的列表中(而不是用户键入的输入文本框)。
无论如何,我使用了来自这个SO问题How to delay the .keyup() handler until the user stops typing?的一些代码来延迟工作。本质上,在每个按键上,它们的jQuery事件处理程序调用myDelay(),给它一个运行的函数和一个超时。如果在下一次按键之前超时未到期,则设置为触发的功能将被另一个(以及新超时)替换。
我的问题是我要求延迟的函数是带有成功处理程序的jQuery ajax调用。当我在成功处理程序中更改值时,在父作用域中看不到更改。
这是延迟功能。它存在于全球范围内。
var myDelay = (function () {
var timer = 0;
return function (callback, ms){
clearTimeout(timer);
timer = setTimeout(callback, ms);
};
})();
以下是使用延迟的代码:
var mySearch = {
publicSearch : function () {
$('#publicSearch').keypress(function () {
myDelay(function () {
var list;
var term = $('#publicSearch input[type=text]').val();
if (term) {
$.getJSON('/search/public', { term : term }, function (data) {
// assign some value to `list` here
})
} else {
list='Please type a term to search on';
}
$('#publicSearch div').html(list);
}, 1000);
});
}
}
在ajax成功处理程序中,我可以将list
的值设置为我喜欢的任何值,但不会在父作用域中看到它。当我调用$('#publicSearch div').html(list)
时,div的内容被设置为null。
我认为这只是一个范围问题,但我无法解决。
请注意,使用延迟的代码位于mySearch命名空间中。这是因为我有几种不同类型的搜索要构建,我需要一种组织代码的机制。