4

我想要一个按钮,作为一些重复发生的定时事件的“开始”和“停止”按钮。

为此,我可以在所有内容的顶部添加一个全局变量:

toggleOn = false; 

然后,在里面<button onClick="...,我可以有:

toggleOn =! toggleOn;
foo(); 
function foo() {
  // do my stuff
  if (toggleOn) {
    setTimeout(foo, 5000);
  }
}

但问题是,我绝不能使用全局变量来完成相同的任务。我该怎么做?是否存在可以携带超出其范围的值的持久变量?

4

3 回答 3

4

这是一个例子,说明闭包是语言的一大特色。

(function()
{
    var active = false;
    myButton.addEventListener('click', function myButtonClick(event)
    {
        if (active) {
            // recursion..?
            setTimeout(myButtonClick, 5000);
        }

        active = !active;
    }
})();

更多关于关闭这里

于 2013-09-26T19:59:36.317 回答
2

使用 javascript 模块模式。像这样的东西:

var handler = function () {
  var private_state = true;
  return function() {
    private_state = !private_state;
    if (private_state) {
      // Do something
    }
  }
}();

用作handler您的按钮onclick处理程序。

于 2013-09-26T19:52:36.183 回答
0

较早的答案已经指出,您可以使用闭包来存储将跟踪状态的“私有”变量。或者,您也可以使用 HTML5 数据来存储它。

html

<button data-toggleOn="false">Click me!</button>

javascript

button.addEventListener('click', function() {
  var toggleOn = this.dataset.toggleOn = !JSON.parse(this.dataset.toggleOn);

  if (toggleOn) {
    // do stuff!
  }
});

如果你使用 jQuery..

$('button').click(function() {
  var toggleOn = !$(this).data('toggleOn');
  $(this).data('toggleOn', toggleOn);
});
于 2013-09-26T20:55:20.003 回答