Javascript:setTimeout() – 需要帮助

我目前正在网页上做一个突出显示function,我正在使用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但它似乎没有帮助。 有任何想法吗?

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

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

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

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

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

你可以使用JQuery油门插件 – 它是一个速率限制器。

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

从这里开始

jQuery throttle / debounce允许您以多种有用的方式对function进行速率限制。 将延迟和回调传递给$ .throttle会返回一个新函数,该函数每延迟毫秒执行一次不超过一次。 将延迟和回调传递给$ .debounce会返回一个只执行一次的新函数,将多个顺序调用合并到一开始或结束的单个执行中。

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

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

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

考虑使用具有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); }); }); 

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

我认为通过将每个突出显示包装在setTimeout中,你可以使它变得更加平滑,就像这样

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

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