我的 jQuery 更改和单击事件似乎有时间问题。在我的站点中,我使用 Ajax 帖子而不是警报,但使用警报更容易重现它。我有一个使用 jQuery 版本 1.7.1 的简单 HTML 页面。
场景是编辑文本框,然后直接单击按钮。change 事件总是被触发,但如果它包含一个警报,则永远不会调用 click 事件。如果我作弊并在警报周围设置超时(您可能需要对那里的值进行一些调整),则通常会调用 click 事件。
/ ** EDIT ** / 如果您在更改事件中的某处设置断点并等待几秒钟,则单击事件也将无法触发。
<script type="text/javascript">
$(document).ready(function ()
{
$("input[type=text]").change(function () {
//alert('changed');
$("#text").text('changed');
setTimeout(function () {
$("#text").text('changed timeout');
alert('changed');
}, 100);
});
$("input[type=submit]").click(function () {
alert('clicked');
$("#text").text('clicked');
});
});
</script>
<div id="main">
<div class="container">
<input type="text" />
<input type="submit" value="click me" />
<div id="text" >bla</div>
</div>
</div>
我的具有保存行为的 Ajax 调用如下:
$.ajax({
type: 'POST',
url: postUrl,
data: form.serialize(),
beforeSend: function () {
// display overlay for work in progress
},
success: function (result) {
updateTableSuccess();
},
complete: function () {
// hide overlay for work in progress
},
error: function (jqXHR) {
if (jqXHR.responseText.length > 0) {
showErrorMessage(jqXHR.responseText);
}
}
});
覆盖只是将 2 个 div 附加到 body 标签。
/ ** 编辑 ** / 似乎覆盖是真正的问题,并导致与警报相同的行为并停止触发点击事件。
showWorkInProgress = function (message, elementId)
{
if ($("#overlay").length == 0)
{
$("<div id='overlay' class='ui-widget-overlay'></div>").appendTo("body");
}
if ($("#workInProgress").length == 0)
{
$("<div id='workInProgress'></div>").appendTo("body");
}
$("#workInProgress").html(message);
if (elementId != null)
{
$("#workInProgress").center(elementId);
}
else
{
$("#workInProgress").center();
}
$("#overlay").show();
$("#workInProgress").show();
};
谁能解释为什么 jQuery 会这样,以及我如何在没有 setTimeout hack 的情况下做得更好?
感谢您的帮助 =)