临时JavaScript onclick切换
我花了很长时间才弄明白这一点。我有一张表格临时JavaScript onclick切换,javascript,function,button,onclick,toggle,Javascript,Function,Button,Onclick,Toggle,我花了很长时间才弄明白这一点。我有一张表格 <form id="form1" .. target="right" action="blablah"> <input .. /> <input type="submit" id="ycsubmit" onclick="..." value="Go!" /> </FORM> 然后我将onclick设置为trigger timer(); 按原样,这会设置timer(),它会设置ycClick(),然后将o
<form id="form1" .. target="right" action="blablah">
<input .. />
<input type="submit" id="ycsubmit" onclick="..." value="Go!" />
</FORM>
然后我将onclick设置为trigger timer();
按原样,这会设置timer(),它会设置ycClick(),然后将onclick切换为null,但在30秒后不会将其切换回原位。我怀疑这与这一行有关:
isEnabled = !isEnabled;
但是删除没有什么区别,它的操作仍然完全相同。有很多方法可以改进代码;其中一些是简单的错误,另一些则表示您应该了解DOM和JavaScript运行时的一些其他特性。以下是我注意到的,顺序如下: 错误
- 在测试
。单个if(isEnabled=true)时,您犯了一个常见错误{
是一个赋值,因此您的代码不是在测试isEnabled是否为true。而是在测试赋值的结果,该结果始终为=
。使用三重等于true
来测试==
当前是否为true。(您还将看到一个双等于isEnabled
,但此运算符可能会产生意外的效果,并且要求不太严格,因此请尽量避免使用它。)==
- 在
,您应该在document.getElementById(“ycsubmit”).onclick=timer()行上;
之后去掉括号。使用括号,您执行timer
函数,而不是为该函数分配引用。onclick方法设置为timer
的返回值,因为您没有指定timer
statement,将是return
未定义的
- 您从未将
设置为false!在当前设置中,您应该保留isEnabled
行isEnabled=!isEnabled
- 我上面的答案演示了一种禁用表单提交的更好方法。您不应该尝试设置和取消设置onclick处理程序;相反,您应该处理处理程序本身内部的重复单击。事实上,这可能更简单:如果此表单正常提交,而不是通过JavaScript验证或通过AJAX发送,那么只需禁用输入,无需担心重新启用,因为服务器完成表单提交处理后,表单将刷新或导航离开。页面将消失或使用启用的提交按钮重新加载
- 您不应使用“提交”按钮上的单击事件来阻止表单提交。表单有一个用于此目的的提交事件。在某些浏览器中,可以通过返回键提交表单,这将绕过您的单击事件。您应该订阅表单的提交事件
- 你不应该使用“onclick”属性来首先分配事件处理程序。您应该将事件侦听器添加到DOM元素中。这将导致更灵活的事件(例如,您可以将多个事件分配给同一元素)以及更好地处理事件执行的范围。最后,它将文档的表示和行为与它的内容。这是jQuery和其他流行库的做法。我知道这需要更多的编码,但这就是为什么存在像jQuery这样的操纵库。你应该试一试
- 您可以这样做:
function ycClick () {
var timestamp = +( new Date );
if ( ycClick.timestamp && timestamp - ycClick.timestamp < 30000 ) return;
ycClick.timestamp = timestamp;
// the actual code of the function
}
函数单击(){
var时间戳=+(新日期);
if(ycClick.timestamp&×tamp-ycClick.timestamp<30000)返回;
ycClick.timestamp=时间戳;
//函数的实际代码
}
现场演示:
在我的演示中,反复单击按钮,您会注意到函数的第二部分仅每3秒执行一次。因此,上面函数的前三行确保后续代码仅在过去30秒内未执行时执行。简单的答案是使用JavaScript“setTimeout”(function(){},t)“其中function是要执行的命令,t=以毫秒为单位的时间
此外,您可能需要设置对象样式以隐藏元素。在此处重新创建问题并在此处粘贴链接可能会为您提供更多帮助。@AlexWayne是对的,但我将尝试在下面为您提供一些一般性指导。您的问题可能是由于以下常见错误造成的
isEnabled=true
=
在()
否则,您分配的是函数调用的结果,而不是函数。该死的漂亮!!这是我最初的想法,但我确信设置超时会更容易…现在看看我是否可以将其应用于我的情况!谢谢!见鬼!它仍然不起作用..我复制/粘贴了您的确切代码!!我有一个新的日期规范我以前也在这页上看到过,但没有解释为什么我刚才链接的过于简化的版本不能使用。请问我做错了什么?@Gordie(1)你有一个语法错误-第4行有一个多余的}
大括号,(2)你写了onclick=“timer();”
,但是函数名是yclick
。我已经纠正了这两件事:(为了演示的目的,我还将按钮从“提交”改为“按钮”)哦,伙计,谢谢你和我粘在一起,西蒙。下次你来佛罗里达时,你得让我给你买杯啤酒。干杯!这里有一个更好的解释我在做什么。页面从不刷新。yclick是一个计数器,表单只用于显示它,每次提交表单时添加+1。它还有另一个用途,而且它确实必须打开“提交”按钮不能只是一个常规按钮。请查看我在这里实现的“Šime Vidas”示例,并告诉我我继续做错了什么。同时,我将使用您的一些指针再次尝试我的方法。
function ycClick () {
var timestamp = +( new Date );
if ( ycClick.timestamp && timestamp - ycClick.timestamp < 30000 ) return;
ycClick.timestamp = timestamp;
// the actual code of the function
}