你不能直接。Javascript 不是多线程的,因此您的函数将运行并阻止任何按键,直到它完成。
从用户体验的角度来看,可以容忍的方式是不要在关键事件上立即触发函数,而是等待一小段时间然后触发事件。
当用户打字时,超时函数会不断地设置和重置,因此不会调用 gosearch 函数,因此用户的打字不会被打断。
当用户暂停输入时,超时将倒计时至零并调用搜索功能,该功能将运行并阻止输入直到完成。但这没关系(只要它在一秒钟左右完成),因为用户当前可能没有尝试输入。
您还可以通过将 gosearch 函数分解为块来执行您实际要求的操作,其中每次调用该函数: * 读取到目前为止已处理的行数的计数器,然后再处理 500 行并增加计数器。* 使用 setTimeout 调用另一个 gosearch,时间值为零。这会向其他“线程”产生事件,并允许快速更改搜索项。
var goSearchTimeout = null;
var linesSearched = 0;
function keySearch(e){
if(goSearchTimeout != null){
clearTimeout(goSearchTimeout);
linesSearched = 0;
}
goSearchTimeout = setTimeout(goSearch, 500);
}
$("#search").keyup(keySearch);
function highLight(index, element) {
if(index >= linesSearched){
var row = "#row-" + element.id.substr(5);
if ($(element).text().toLowerCase().indexOf(searchString,0) != -1){
$(row).show();
else{
$(row).hide();
}
if(index > linesSearched + 500){
linesSearched = index;
goSearchTimeout = setTimeout(goSearch);
return;
}
}
function goSearch(){
goSearchTimeout = null;
var searchString = $("#search").val().toLowerCase();
$(".lplist").each(highLight);
}
如果您要使用这样的超时回调,我强烈建议您将代码包装到 jQuery 小部件中,以便您可以使用对象上的变量来存储变量 goSearchTimeout 等,而不是让它们作为全局变量浮动。