Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 禁用HTML按钮后';它点击了吗?_Javascript_Html_Angularjs - Fatal编程技术网

Javascript 禁用HTML按钮后';它点击了吗?

Javascript 禁用HTML按钮后';它点击了吗?,javascript,html,angularjs,Javascript,Html,Angularjs,我正在使用AngularJS创建一个web表单。除其他外,此表单包含三个按钮,单击此按钮时,将以三种不同的方式对无序列表中的列表项进行排序。我观察到在延迟峰值期间出现了一些奇怪的行为,而在第一个方法调用仍在运行时单击这3个按钮中的另一个按钮会导致一个竞争条件,从而打乱无序列表。为了防止出现这种情况,我尝试在这3个按钮的onClick函数运行期间禁用它们 为了真正将此修复推向极限,我运行了一些自动测试,这些测试旨在交替和重复地单击其中两个按钮。这个想法是,即使测试软件以超人的速度在两个按钮之间点击

我正在使用AngularJS创建一个web表单。除其他外,此表单包含三个按钮,单击此按钮时,将以三种不同的方式对无序列表中的列表项进行排序。我观察到在延迟峰值期间出现了一些奇怪的行为,而在第一个方法调用仍在运行时单击这3个按钮中的另一个按钮会导致一个竞争条件,从而打乱无序列表。为了防止出现这种情况,我尝试在这3个按钮的onClick函数运行期间禁用它们

为了真正将此修复推向极限,我运行了一些自动测试,这些测试旨在交替和重复地单击其中两个按钮。这个想法是,即使测试软件以超人的速度在两个按钮之间点击,当第一个按钮的方法调用正在运行时,第二个按钮也不会被点击

我尝试了几种方法来实现这一点-在每个按钮上使用ng disabled属性,绑定到一个作用域级别变量,每个方法在其方法的开始和结束时切换为true和false,在每个函数的开始和结束时手动禁用按钮-但在每种情况下,测试报告仍在触发竞争条件


考虑到我在方法调用的一开始就手动禁用这些按钮,似乎这还不够。有人知道我可以在点击按钮后最早禁用按钮的位置吗?

定理:

您遇到的问题是,正在运行的脚本有效地对单击进行排队。只要事件处理程序正在运行,浏览器窗口就没有响应,但仍会记录单击,并在处理程序完成后立即进行处理

所以你要做的是

在handler1中:

  • 禁用按钮2
  • 做所有的处理
  • 启用按钮2
只有在这之后,才会处理单击(即使您在事件处理期间单击了它)。由于按钮2在当时处于启用状态,handler2也将运行

证明:

使用一段HTML,您可以检查:

<button id="test1" onclick="window.test1();">Test1</button>
<button id="test2" onclick="window.test2();">Test2</button>
Test1
测试2
和脚本:

window.test1 = function()
{
    document.getElementById('test2').disabled  = true;
    for (var i=0; i<1000000000; i++);
    document.getElementById('test2').disabled  = false;
    alert('Test1 done'); // Notice: Alert after enabling button 2.
}

window.test2 = function()
{
    document.getElementById('test1').disabled  = true;
    for (var i=0; i<1000000000; i++);
    alert('Test2 done'); // Notice: Alert before re-enabling button 1.
    document.getElementById('test1').disabled  = false;
}
window.test1=函数()
{
document.getElementById('test2')。disabled=true;

对于(var i=0;我希望你能给出这样一个彻底的答案;如果可能的话,我会投更多的赞成票。我只能降低我的测试期望值。
window.enableTest2 = function()
{
    document.getElementById('test2').disabled  = false;
}

window.test1 = function()
{
    document.getElementById('test2').disabled  = true;
    for (var i=0; i<1000000000; i++);
    setTimeout(window.enableTest2, 1);
}