禁用函数的JavaScript计时器

禁用函数的JavaScript计时器,javascript,timer,onclick,Javascript,Timer,Onclick,我有一个表单,其中提交按钮触发一个函数。让我们称之为YCLICK。我需要这个功能被禁用30秒后提交,但我需要提交按钮继续工作。我不想禁用整个按钮,只想禁用它触发的功能。如果用户在30秒前再次点击按钮,我需要再次提交,但不需要再次点击。我试过无数种不同的方法,但都没用。最后,我感觉自己离目标越来越近了,但由于某种原因,它仍然不起作用。当我点击它的时候,点击根本没有执行。我做错了什么?以下是我得到的: function ycClick(){ ... } function toggleS

我有一个表单,其中提交按钮触发一个函数。让我们称之为YCLICK。我需要这个功能被禁用30秒后提交,但我需要提交按钮继续工作。我不想禁用整个按钮,只想禁用它触发的功能。如果用户在30秒前再次点击按钮,我需要再次提交,但不需要再次点击。我试过无数种不同的方法,但都没用。最后,我感觉自己离目标越来越近了,但由于某种原因,它仍然不起作用。当我点击它的时候,点击根本没有执行。我做错了什么?以下是我得到的:

function ycClick(){
    ...
}



function toggleSubmit() {
    if (document.getElementById('ycsubmit').onclick == null) {
        document.getElementById('ycsubmit').onclick = ycClick();
    } else {
        document.getElementById('ycsubmit').onclick = null;
    } 
} 


function timer()
{

  if (count <= 0 || count == null)
  {
  ycClick();
  } else {
  count=30;
  counter=setInterval("timer()",1000);
  count=count-1;
 toggleSubmit();
}
}

<FORM ID="myform">
    <INPUT ID="ycsubmit" TYPE="SUBMIT" ONCLICK="timer();">
</FORM>

这将切换按钮:

var isEnabled = true;

function toggleSubmit() {
    if (isEnabled) {
        document.getElementById("ycsubmit").onclick = function() {};
    } else {
        document.getElementById("ycsubmit").onclick = ycClick;
    } 

    isEnabled = !isEnabled;
}
此外,使用setInterval时,计时器不需要括号或引号,如下所示:

counter=setInterval(timer,1000);
更好的是,如果您想等待30秒,只需切换按钮的功能,然后在30秒后再次执行

toggleSubmit();
setTimeout(toggleSubmit(), 30000);

要详细说明Incompl的答案:

设置超时函数时,它使用您提供的值。从技术上讲,您的setTimeouttimer为1000;你想干什么就干什么

超时将以与函数工作类似的方式评估计时器

但是,执行诸如setTimeouttoggleSubmit之类的操作,30000;如果您不知情/缺乏经验,将产生意外结果。超时必须得到您提供的值,在这种情况下,超时将调用toggleSubmit函数,期望它返回一个它没有返回的值。因此,我们最终只调用函数两次,超时没有要触发的函数

为了纠正这一点,您必须避免在函数名称后面包含。执行此操作时,它充当变量,其值是函数中的实际代码


这很好地为setTimeout函数的另一个特性做好了准备。setTimeouttoggleSubmit,30000,您好,先生;将调用toggleSubmit函数并提供参数hello there和sir。该函数实际上不接受任何参数,因此它不会对这些参数做任何处理,但知道这一点是件好事。

它到底是如何不起作用的?具体点。@CBredlow,请不要修复有问题的代码。这可能是真正的问题。戈迪:你给了你的输入元素ID mysubmit,但你把它称为ycsubmit。我没有改变代码,我去掉了大写。哦,克鲁德,你说得对。它看起来像是我在修订版中修改的,但实际上它是的另一个实例,由最初提出问题五分钟或更短时间后的OP编辑触发。很抱歉发布诽谤,@CBredlow。没问题,我将在更改中更详细地介绍。