我一直在调查浏览器之间的事件火灾顺序,因为我们的应用程序正在经历一些不寻常的行为。
我创建了一个小测试来查看三个事件的顺序: change、keydown和keypress。
下面是HTML (test.html):
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
<script src="test.js"></script>
</head>
<body>
<input type="text" id="TextBox" />
<input type="button" id="Button" value="Clear Results"/>
<hr />
<table id="ResultTable" style="width: 100px">
<tr><th>Results</th></tr>
</table>
</body>
</html>
以下是JS (test.js):
/*
Appends event information to display table.
*/
$(document).ready(function() {
$("#TextBox").change(function() {
$("<tr><td>Change</td></tr>").appendTo("#ResultTable");
});
$("#TextBox").keydown(function() {
$("<tr><td>Key down</td></tr>").appendTo("#ResultTable");
});
$("#TextBox").keypress(function() {
$("<tr><td>Key press</td></tr>").appendTo("#ResultTable");
});
$("#Button").click(function() {
$("#ResultTable").empty();
$("<tr><th>Results</th></tr>").appendTo("#ResultTable");
});
});
当我在文本框中键入字母f时,然后按enter,在Internet 8中得到以下内容:
结果
H 111
键按H 212F 213
但是在Firefox (3.6.8)中,我得到了以下内容:
结果
更改事件的顺序非常重要,因为我们在keydown事件中捕获enter键,但对更改事件进行一些验证。
我已经四处看过了,但还没能确定问题出在哪里。
这是预期的行为吗?所有浏览器是否应该按指定的顺序触发jQuery事件?还是我们应该删除所有关于事件触发顺序的假设?还是有什么别的东西妨碍了我的思考?
发布于 2010-08-14 02:07:07
我在网上找不到关于这个特定场景的任何细节,只是在浏览器的实现中,事件顺序是不应该被假定的。
这导致我删除了更改方法总是在onkeydown之后出现的假设,并且必须考虑到这一点来设计我的验证/提交过程。
基本上,我将把验证/提交移到一个方法中,并从这两个事件调用它,但要确保只使用一个标志调用它一次。
如果有人在这方面有任何额外的信息/建议,那就太好了。:)
发布于 2013-08-28 12:32:33
我知道这个问题很老,但最后我在与OP类似的情况下这样做了:
$("#my_form").one("change keypress", ":input", ask_user_to_save_before_leaving);
https://stackoverflow.com/questions/3473256
复制相似问题