【发布时间】:2011-11-04 17:16:48
【问题描述】:
Onsubmit 事件可以静默地杀死 onchange 事件,如果同时调用的话。我假设 js 引擎中的竞争条件。在 chrome、FF3、FF6 和 IE9 中测试。
要重现,您需要更改输入内容并单击提交按钮。不要在输入更改和提交按钮点击之间进行任何额外的点击。
<div id="somediv">
<div>one</div>
<div>two</div>
</div>
<form method="POST" id="someform">
<input type="text" name="input1" id="someinput" value="change me" />
<input type="submit" />
</form>
<script type="text/javascript">
document.getElementById('someinput').onchange = function() {
//some delay - DOM operations, AJAX or alert:
document.getElementById('somediv').getElementsByTagName('div')[1].style.display = 'none';
//or alert('123');
}
document.getElementById('someform').onsubmit = function() {
alert('This event is not called');
}
</script>
预期行为:onchange 事件,而不是 onsubmit。
如果我们使用按钮而不是一个接一个地提交和调用事件 - 一切都会按预期工作。
如果 onchange 事件中没有操作(无延迟) - 按预期工作。
如果 onchange 会改变 div 的颜色(不显示) - 有时 (3/10) 会按预期工作,哈哈。
js-guru,请解释一下,到底发生了什么?
【问题讨论】:
-
这不是竞争条件。除了网络工作者之外,JavaScript 在每个浏览器的单个线程中执行。
-
好吧,就这样吧。但它比什么呢?
-
我正在尝试在 Ubuntu 上的 Chrome 中重现它 - 不走运(尝试了几十次)。每次两个回调都被触发。可能是特定于操作系统的东西吗?
-
一分钟前在 Ubuntu 10 上的 Chrome 15.0.874.120 中尝试过:未提交表单。你确定,你能正确地复制它吗?您应该在更改“输入”后立即单击“提交”。
-
创建了一个 jsFiddle 来查看这种奇怪的行为:jsfiddle.net/amwebexpert/Lmdp6bp7
标签: javascript events browser dom-events