jQueryの変更イベントとクリックイベントのタイミングに問題があるようです。私のサイトでは、アラートの代わりにAjax投稿を使用していますが、アラートを使用して再現する方が簡単です。jQueryバージョン1.7.1を使用した単純なHTMLページがあります。
シナリオでは、テキストボックスを編集してから、ボタンを直接クリックします。変更イベントは常に発生しますが、アラートが含まれている場合、クリックイベントが呼び出されることはありません。不正行為をしてアラートの周りにタイムアウトを設定すると(そこにある値を少し試してみる必要があるかもしれません)、クリックイベントは通常どおり呼び出されます。
/ **編集** /変更イベントのどこかにブレークポイントを設定して数秒待つと、クリックイベントも発生しません。
<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を追加するだけです。
/ **編集** /オーバーレイが実際の問題であり、アラートと同じ動作を引き起こし、クリックイベントの発生を停止しているようです。
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ハックなしでこれをより適切に行う方法を誰かが説明できますか?
助けてくれてありがとう=)