我正在研究类似于自动完成的功能,但不完全相同。主要区别在于 ajax 返回的匹配值显示在单独 div 的列表中(不是用户输入的输入文本框)。
无论如何,我使用了这个 SO 问题中的一些代码,如何延迟 .keyup() 处理程序直到用户停止输入?,让延迟工作。本质上,在每次按键时,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 命名空间中。这是因为我要构建几种不同类型的搜索,并且我需要一种组织代码的机制。