Javascript:无法清除超时

标签 javascript angularjs angularjs-directive settimeout cleartimeout

我试图在用户停止输入后短暂延迟后调用一个函数,但 clearTimeout() 似乎并没有按照我的想法进行。以下内容位于 Angular JS Controller 内。

$scope.typing = false;
$scope.delay = undefined;

//Triggered by ng-keydown...
$scope.startTyping = function() {
    $scope.typing = true;
            console.log('start1', $scope.delay); //6
    clearTimeout( $scope.delay );
            console.log('start2', $scope.delay); //6... NOT getting cleared!
}

//Triggered by ng-keyup...
$scope.stopTyping = function() {
    $scope.typing = false;
    $scope.delay = setTimeout( $scope.lookup, 1000);
}

$scope.lookup = function() {

    if ($scope.typing === true){
        return false;
    }
    console.log('lookup'); //This fires after every key!

我在日志中看到每个键的 lookup,而不是在每次延迟之后。这是为什么?

更新

记录 delay 的值后,很明显 clearTimeout() 没有重置计时器,而是设置了多个计时器,每个计时器都在触发查找功能。

供引用...

对于解决 clearTimeout() 问题的其他人,这里有一些类似的问题可能会解决您的问题(但没有解决我的问题):

clearTimeout not working

clearTimeout() not working

clearTimeout is not working

clearTimeout not working

最佳答案

http://jsfiddle.net/coma/y52Q2/1/

Controller

app.controller('Main', function ($scope) {

    var delay;

    var lookup = function() {

        console.log($scope.input);
    };

    $scope.lookup = function() {

        clearTimeout(delay);
        delay = setTimeout(lookup, 1000);
    };
});

查看

<div ng-controller="Main">
    <input ng-model="input" ng-change="lookup()"/>
</div>

向上/向下尝试的问题在于 stopTypingstartTyping 被调用的次数更多:

http://jsfiddle.net/coma/5hFjY/1/

关于Javascript:无法清除超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20744935/

相关文章:

javascript - 使用 jQuery 滚动到某个元素

javascript - 用螺旋线包裹圆环

javascript - AngularJS - 使用 ng-include append html

javascript - AngularJS 待办事项列表应用程序

AngularJS - 从嵌入范围访问指令范围

javascript - Angular Directive(指令)的属性

javascript - 单击按钮时更改 JavaScript 中的 CSS 样式,但按下另一个按钮时更改回原始样式

javascript - Apps 脚本 - 向用户更新代码执行状态

javascript - 删除 ng-click 上的 Angular 限制

javascript - AngularJS 指令对属性更改没有反应