【问题标题】:Clearing an interval that was set before [duplicate]清除在[重复]之前设置的间隔
【发布时间】:2014-07-14 11:19:46
【问题描述】:

http://jsfiddle.net/x5MY8/2/

HTML

<div id="easy">easy</div>
<div id="hard">hard</div>

JS

function test(mode) {
    var asd = this;
    this.mode = mode;
    setInterval(function () {
        alert(asd.mode);
    }, 1000);
}

$(document).ready(function () {

    $('#easy').on('click', function () {

        var stuff = new test('easy');


    });
    $('#hard').on('click', function () {

        var stuff = new test('hard');


    });

});

按下easy 按钮后,会启动一个事件,每秒都会轻松发出警报。如果我之后按hard,它将启动另一个事件,它会提醒easy, hard, easy, hard..,但我希望它只提醒当时按下的内容,所以我必须以某种方式清除之前的间隔。我怎样才能做到这一点?不知何故,当按下另一个对象上的按钮时,我需要调用clearInterval,但我真的不知道该怎么做。

【问题讨论】:

标签: javascript jquery


【解决方案1】:

http://jsfiddle.net/x5MY8/3/

你需要像这样存储和清除间隔

var interval;

function test(mode) {

    var asd = this;
    this.mode = mode;

    if (interval) {
        clearInterval(interval);
    }

    interval = setInterval(function () {
        alert(asd.mode);
    }, 1000);
}

【讨论】:

  • 除了使用全局变量之外别无他法?我希望它完全是面向对象的。
  • @GeorgeIrimiciuc 你应该有一些静态的东西来控制对象之间的间隔。所以你被全局变量卡住了,或者测试类静态字段,或者将带有间隔的工作包装到单独的静态(帮助器)类中
  • 它需要在这个函数之外,你如何组织你的代码取决于你,但通常建议用 IIFE(闭包)包装你的代码,这样它就会把变量带到全局范围之外。但是window 无论如何都是一个对象,所以它在技术上仍然是 OOP ;)
  • @GeorgeIrimiciuc 作为test 类的静态字段:jsfiddle.net/x5MY8/7
【解决方案2】:

将其存储在变量中:

var interval = setInterval(function(){
//your code
},1000);

现在,您可以使用 clearInterval 清除:

clearInterval(interval);

【讨论】:

  • 我在代码中的什么地方调用 clearInterval?如果我把它放在其他事件中,它将无法访问它。
【解决方案3】:

每次点击时清除值

 var clear=0;

    function test(mode) {
        var asd = this;
        this.mode = mode;
        clear=setInterval(function () {
            alert(asd.mode);
        }, 1000);
    }

    $(document).ready(function () {

        $('#easy').on('click', function () {
    clearInterval(clear); 
            var stuff = new test('easy');


        });
        $('#hard').on('click', function () {
       clearInterval(clear); 
            var stuff = new test('hard');


        });

    });

【讨论】:

  • gillesc 的答案更好:尝试清除 ID 为 0 的间隔时会出错(在调用第一个 setInterval 之前)。此外,您必须在每个 new test 之前致电 clearInterval,这不好。
  • @Regent 你检查了那个代码吗?它即将出现错误..你能告诉我 setInterval 什么会再次出现
  • @Regent 看到这个网址jsfiddle.net/x5MY8/6
  • @Regent 你知道吗? setInterval 函数返回一些数字
  • 是的,setInterval 返回 ID(即数字)。事实证明,clearInterval 在您将不正确的 ID 传递给它时不会产生错误(例如第一次单击时示例中的 0)。所以你的代码中唯一的问题是在创建新对象之前必须调用clearInterval
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
相关资源
最近更新 更多