【问题标题】:clearTimeout & setTimeout functionclearTimeout & setTimeout 函数
【发布时间】:2011-03-07 17:52:52
【问题描述】:

作为question 的后续行动,我想知道为什么这不起作用

$("#textarea").keydown(function(){
oldValue = $("#textarea").val();
});
$("#textarea").keyup(function(){
var startTimer = null;
if(startTimer) clearTimeout(startTimer);
startTimer = setTimeout(function(){
var newValue = $("#textarea").val();
// get something out of the comparison
alert(something) // alert the comparison
  oldValue = newValue;

},2000);

要求的行为是仅当用户在 2 秒内没有输入任何内容时才会收到警报消息。它与比较部分一样有效,但是,当我按应有的方式继续输入时,它不会停止警报消息。相反,我得到的警报数量与按下的键数量相同。 我尝试了一个创建和删除 cookie 的版本,效果很好。在这种特殊情况下有什么问题?

【问题讨论】:

  • var startTimer = null; if(startTimer) clearTimeout(startTimer); //条件永远不会为真...
  • @JAAulde:当然,你是对的。谢谢:-)

标签: javascript jquery settimeout jquery-events


【解决方案1】:

每次调用 keyup 处理程序时,您都会获得一个新的 startTimer(并将其初始化为 null)。尝试在外部范围内声明它:

(function() {
    var startTimer = null;
    var oldValue; // Declare this too, so it isn't global

    $("#textarea").keydown(function(){
        oldValue = $("#textarea").val();
    });
    $("#textarea").keyup(function(){
        if(startTimer) {
            clearTimeout(startTimer);
        }
        startTimer = setTimeout(function(){
            var newValue = $("#textarea").val();
            // get something out of the comparison
            alert(something) // alert the comparison
            oldValue = newValue;
        },2000);
    });
})();

【讨论】:

  • 当然。这样就解决了问题。它不会产生我想要的行为,但绝对可以解决这个问题。谢谢!
【解决方案2】:

我认为您真正想要的是使用节流或去抖动样式功能。这是一个家伙,他编写了一个可以使用或不使用 jQuery 的工具,并且可以完全按照您的要求进行操作。我会试一试的。

http://benalman.com/projects/jquery-throttle-debounce-plugin/

节流 使用 jQuery throttle / debounce,您可以将延迟和函数传递给 $.throttle 以获得一个新函数,当重复调用时,执行原始函数(在相同的上下文中并通过所有参数传递)每次延迟不超过一次毫秒。

限制对于限制处理程序在调整大小和滚动等事件上的执行速度特别有用。只需查看以下使用示例或工作节流示例即可亲自了解!

还可以查看他使用的精彩工作流程图像。我不会热链接,但值得阅读这篇文章以了解已经存在的库,这样您就可以节省一些时间。

【讨论】:

  • 1+。这看起来很有希望。我一定会看看的。但是,我想知道为什么我的代码中没有得到预期的行为。
  • @Robert ~ 不客气。我知道有人(在这种情况下是马修)会一起调试你所面临的实际问题,但我偶然发现了几周前我在另一个问题上提供的链接,并认为我会在帮助中支付它。我完全赞成使用独立于框架的 javascript 来帮助我,所以我不必重写任何东西,你知道吗?
  • 我同意。此外,让我告诉您,您的建议实际上通过在 keydown 函数中使用 $.debounce 实现了我想要的(以及 Matthew 更正)。谢谢!。
猜你喜欢
  • 1970-01-01
  • 2011-03-02
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
相关资源
最近更新 更多