Javascript:setTimeout() - 需要帮助

时间:2010-04-06 11:14:40

标签: javascript jquery

我目前正在网页上做一个突出显示功能,我正在使用jquery插件。我的代码如下所示:

var input = function() {         
    var matchword = $('#searchbox').val();
    if(matchword != "") {
        $('body').removeHighlight();
        $('body').highlight($('#searchbox').val());
    }
}

$(document).ready(function() {
    $('#searchbox').keyup(function() {
        setTimeout("input()", 2000);    
    });
});

如果页面上没有如此大量的数据,它可以正常工作。但是如果页面上有大量数据,整个过程会变慢,导致输入框冻结,直到字母突出显示。因此打字不顺畅。我尝试使用setTimeout但它似乎没有帮助。有什么想法吗?

6 个答案:

答案 0 :(得分:4)

请不要传递setTimeout一个字符串,在这种情况下没有必要,你可以直接调用这个函数:

$(function() {
    $('#searchbox').keyup(function() {
       if($(this).data("timeout")) clearTimeout($(this).data("timeout"));
        $(this).data("timeout", setTimeout(input, 2000));
    });
});

至于排队高亮的另一个问题,你只需要像上面那样清除之前的超时(从最多2秒前)。此外,您可以使用.data()在本地存储此超时,如上所述,更少的全局变量,您可以在多个元素中使用它而不是每个元素的超时变量。

答案 1 :(得分:2)

在您提供的示例中,setTimeout仅延迟执行该函数,但执行次数仍然相同。你需要做的是,每次用户键入一个字符时刷新超时,所以每次都不会触发input()函数:

var timer;

$('#searchbox').keyup(function() {
  clearTimeout(timer);
  timer = setTimeout(input, 2000);
});

答案 2 :(得分:1)

你可以使用JQuery throttle插件 - 这是一个速率限制器。

  

实际上并不需要jQuery   这个插件,因为没什么内部的   使用任何jQuery方法或属性。   jQuery仅用作命名空间   这些方法可以存在。

来自here

  

jQuery油门/去抖可以让你   限制你的功能   多种有用的方式。传递延迟   并回调$ .throttle返回一个   不再执行的新功能   比每延迟毫秒一次。   传递延迟和回调   $ .debounce返回一个新函数   将只执行一次,合并   多个顺序调用到   单独执行任何一个   开始或结束。

答案 3 :(得分:1)

现在超时没有帮助,因为你只是将所有键盘事件的执行延迟了2000毫秒 - 它只会在2秒后冻结浏览器。我假设你想要的是当 last keyup事件有2000毫秒时,然后触发input函数。这可以这样完成:

$(document).ready(function() {
    var keyUpTimeout;
    $('#searchbox').keyup(function() {
        clearTimeout(keyUpTimeout);
        keyUpTimeout = setTimeout("input()", 2000);    
    });
});

当您使用clearTimeout清除先前的超时时,input函数仅在写入停止时被调用一次。因此,当用户暂停写入2秒钟时,文本会突出显示。

答案 4 :(得分:1)

考虑使用具有setInterval函数的焦点和模糊侦听器,而不是使用keyup侦听器。在下面的例子中,我只在“searchbox”值发生变化时才调用输入法。这样我就可以避免对输入法进行不必要的调用[比如用户按下shift键]。

$(document).ready(function() {
    var highlightInterval;
    var previousValue = $('#searchbox').val();
    $('#searchbox').focus(function() {
       if(highlightInterval) {
          window.clearInterval(highlightInterval);
       }
       highlightInterval = window.setInterval(function(){ 
          if(previousValue != $('#searchbox').val()){
             previousValue = $('#searchbox').val();
             input();       
          }
       }, 2000);
   });
   $('#searchbox').blur(function(){
       window.clearInterval(highlightInterval);
   });
});

答案 5 :(得分:0)

据我所知,突出显示的方法是寻找$('#searchbox').val()的所有外观,然后以某种突出显示方式对其进行处理。如果我错了,请纠正我!

我认为你可以通过在setTimeout中包装每个突出显示来使它更顺畅,就像这样

function wrapIntoHighligh(something){
  ...
}

for(var i = 0; i < occurrences.length; i++){
   setTimeout("wrapIntoHighligh(something)", 1);
}

它可能不是更清晰的解决方案......但它会使每个突出显示都退出循环,它将再次在JS堆栈中启用,并希望它不会阻止所有内容。