【发布时间】:2013-01-07 15:36:45
【问题描述】:
我的 jQuery 更改和单击事件似乎存在时间问题。在我的站点中,我使用 Ajax 帖子而不是警报,但使用警报更容易重现它。我有一个使用 jQuery 版本 1.7.1 的简单 HTML 页面。
场景是编辑文本框,然后直接单击按钮。 change 事件总是被触发,但如果它包含一个警报,则永远不会调用 click 事件。如果我作弊并在警报周围设置了超时(您可能需要对那里的值进行一些调整),则通常会调用 click 事件。
/** 编辑 **/ 如果您在更改事件中的某处设置断点并等待几秒钟,则单击事件也将无法触发。
<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 的情况下做得更好?
感谢您的帮助 =)
【问题讨论】:
-
警报与此有什么关系?警报不会改变代码的执行方式,它只会阻止浏览器,直到您单击“确定”。当输入失去焦点时,会发生更改事件,从而导致阻止浏览器的警报框,从而阻止与提交按钮进行交互(我猜)。使用 console.log() 进行调试,或者甚至更好,使用调试器逐行调试。
-
如果我在 $("#text").text('changed'); 上调试并设置断点并等待几秒钟点击事件也不会被触发。我将为此编辑帖子..
-
您的代码运行良好。 jsfiddle.net/w9Thc/5 停止卡在警报中。解决真正的问题。
-
您在使用
async: false处理您的ajax 请求吗? -
不,这是默认值,所以是真的。