Javascript 禁用HTML按钮后';它点击了吗?
我正在使用AngularJS创建一个web表单。除其他外,此表单包含三个按钮,单击此按钮时,将以三种不同的方式对无序列表中的列表项进行排序。我观察到在延迟峰值期间出现了一些奇怪的行为,而在第一个方法调用仍在运行时单击这3个按钮中的另一个按钮会导致一个竞争条件,从而打乱无序列表。为了防止出现这种情况,我尝试在这3个按钮的onClick函数运行期间禁用它们 为了真正将此修复推向极限,我运行了一些自动测试,这些测试旨在交替和重复地单击其中两个按钮。这个想法是,即使测试软件以超人的速度在两个按钮之间点击,当第一个按钮的方法调用正在运行时,第二个按钮也不会被点击 我尝试了几种方法来实现这一点-在每个按钮上使用ng disabled属性,绑定到一个作用域级别变量,每个方法在其方法的开始和结束时切换为true和false,在每个函数的开始和结束时手动禁用按钮-但在每种情况下,测试报告仍在触发竞争条件Javascript 禁用HTML按钮后';它点击了吗?,javascript,html,angularjs,Javascript,Html,Angularjs,我正在使用AngularJS创建一个web表单。除其他外,此表单包含三个按钮,单击此按钮时,将以三种不同的方式对无序列表中的列表项进行排序。我观察到在延迟峰值期间出现了一些奇怪的行为,而在第一个方法调用仍在运行时单击这3个按钮中的另一个按钮会导致一个竞争条件,从而打乱无序列表。为了防止出现这种情况,我尝试在这3个按钮的onClick函数运行期间禁用它们 为了真正将此修复推向极限,我运行了一些自动测试,这些测试旨在交替和重复地单击其中两个按钮。这个想法是,即使测试软件以超人的速度在两个按钮之间点击
考虑到我在方法调用的一开始就手动禁用这些按钮,似乎这还不够。有人知道我可以在点击按钮后最早禁用按钮的位置吗?定理: 您遇到的问题是,正在运行的脚本有效地对单击进行排队。只要事件处理程序正在运行,浏览器窗口就没有响应,但仍会记录单击,并在处理程序完成后立即进行处理 所以你要做的是 在handler1中:
- 禁用按钮2
- 做所有的处理
- 启用按钮2
<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);
}