そうでない場合は、ブラウザが提出するJavaScriptコードを中断しませんので、あなたは、その(などsetTimeout
、非同期AJAX呼び出し、)ブラウザに「利回り」何かをしなければなりませんフォーム。それを証明する例については以下を参照してください。あなたはがblur
ハンドラ内からブラウザに与える何かをしている場合は
、あなたはsubmit
ハンドラでフォームの送信を防止し、その後(のさまざまなアクションを含むとき、すべてそれが提出され得る持っている必要がありますblur
ハンドラ)が準備完了です。これは少し複雑かもしれません。
最良の答えは、ブラウザに送信されているblur
ハンドラにあるものをすべて削除することです。あなたがそれを行うことができない場合、あなたはおそらく、フォームのロックカウンターを見て、提出ハンドラは、そのロックカウンタチェック抱えている:
// Somewhere, ensure the form has a lock count of zero
$('#theForm').data('submitlock', 0);
// Your blur handler increments the lock
// In the blur handler:
$('#theForm').data('submitlock', $('#theForm').data('submitlock') + 1);
// ...and when done
$('#theForm').data('submitlock', $('#theForm').data('submitlock') - 1);
// The submit handler might look something like this:
$('#theForm').submit(function() {
// Get a jQuery wrapper for the form
var $this = $(this);
// Locked?
if ($this.data('submitlock') > 0) {
// Yes, set up the recheck and prevent form submission
setTimeout(recheck, 10);
return false;
}
// Function to periodically retry submission
function recheck() {
// Still locked?
if ($this.data('submitlock') > 0) {
// Keep waiting
setTimeout(recheck, 10);
}
else {
// Nope, submit the form using the underlying DOM object's submit function
$this[0].submit();
}
}
});
Live example(以下、当社のブロッキングの例のバージョンを、それに更新しますブラウザへの収率)
フォームが新しいウィンドウに提出されている場合、新しいウィンドウには、ユーザーのクリックに直接対応してないので、あなたは)(ポップアップブロッカーの抵触実行することができることに注意してください。しかし、もしあなたがそういうことをやっていないなら、あなたは上の方といい形をしています。ここで
は、フォームが送信される前に、かなりの遅延(4秒)を引き起こすblur
ハンドラ(live copy)の例です:
HTML:
<form action='http://www.google.com/search' target='_new'>
<label>Search for:
<input type='text' name='q' value='foo'></label>
<br><input type='submit' value='Search'>
</form>
はJavaScript:
$('input[name=q]').blur(function() {
var end, counter;
display("Start blurring");
counter = 0;
end = new Date().getTime() + 4000;
while (new Date().getTime() < end) {
++counter;
if (counter % 100000 == 0) {
display("Still blurring");
}
}
display("Done blurring");
});
テキストボックスにカーソルを置き、Searをクリックします。 ch。 4秒間の遅延が表示され、検索が新しいウィンドウで開きます。私はChrome、Firefox、Opera(Linuxの場合)、Windows 2000の場合はIE6、Windows XPの場合はIE7でこれをテストしました。すべて同じように動作しました。
* "処理の途中でフォームが送信されます。" *本当ですか?あなたは何か収穫をしていますか? ( 'setTimeout'、ajax ...) –