如何在特定时间禁用单击事件处理程序?

时间:2013-06-03 12:36:18

标签: javascript onclick

只有JavaScript,没有jquery。

代码如下:

window.onload = addListeners;
function addListeners(){
    for(var  i = 0 ; i < document.getElementsByClassName('arrow').length; i++){
    if(window.addEventListener){
        document.getElementsByClassName('arrow') [i].addEventListener( 'click', func , false);

    }else{
        document.getElementById('arrow') [i].attachEvent('onclick' , func);
    }
}
}


function func(){
//Takes exactly 5 seconds to execute
}

现在,我想在函数'func()'运行时禁用'click'5秒钟。然后,在'func()'完全执行后,再次自动启用点击。

如何仅使用JavaScript执行此操作?

3 个答案:

答案 0 :(得分:5)

不是禁用click事件,而是检查变量以查看它当前是否正在运行。

var funcRunning = false;
function func(){
  if (funcRunning) return;
  funcRunning = true;

  //Function logic here

  funcRunning = false;
  return //whatever  
}

这样你不会猜测函数需要5秒才能运行,该函数在完成当前运行之前不会执行其逻辑。

编辑:正如@NULL建议的那样,更好的方法是将布尔变量存储在函数本身以防止全局污染:

function func(){
  if (func.IsRunning) return;
  func.IsRunning = true;

  //Function logic here

  func.IsRunning = false;
  return //whatever  
}

答案 1 :(得分:4)

详细说明我对Curts answer的评论:

当声明函数func时,你可以做两件事:

function func() {
    if ( !func.isRunning ) {
        func.isRunning = true;
        /* logic goes here */
        func.isRunning = false;
    }
}

或者您可以在其中创建一个闭包并存储isRunning:

var func = (function() {
    var isRunning = false;
    return function() {
        if ( !isRunning ) {
            isRunning = true;
            /* logic goes here */
            isRunning = false;
        }
    };
})();

第二个例子可以使私有变量只能在闭包内访问。


它主要是关于一种设计模式,一些开发人员不喜欢将变量直接存储在像示例一样的函数中。唯一的区别是,如果有人选择设置func.isRunning = true,则该功能无法再次运行,因此无法自行重置。

答案 2 :(得分:1)

如果你的函数是异步的(它根据我的理解发送了ajax请求),你最好为该请求创建一个“成功”回调并在那里处理funcRunning标志。

以下是一个例子:

var funcRunning = false;
function func() {
  if (funcRunning) {
    return;
  }
  funcRunning = true;
  var xmlhttp = new XmlHttpRequest();
  xmlhttp.open('GET', '/xhr/test.html', true);
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
       if (xmlhttp.status == 200) {
         // do something.
         funcRunning = false;
       }
    }
  };
}

P.S。当前示例在创建XmlHttpRequest实例(不是crossbrowser)时不是最正确的。它仅作为示例显示。