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堆栈中启用,并希望它不会阻止所有内容。