誰かが作業を保存せずに特定のページから移動しようとすると、ダイアログボックスがポップアップします。私はJavascriptのonbeforeunloadイベントを使用しています。
ここで、ユーザーが表示されたダイアログで[キャンセル]をクリックしたときにJavascriptコードを実行したいと思います(ページから移動したくないなど)。
これは可能ですか?私もjQueryを使用しているので、beforeunloadcancelのようなイベントにバインドできますか?
[〜#〜] update [〜#〜]:アイデアは、実際にユーザーを保存して別のWebページに誘導することです彼らがキャンセルを選択した場合
あなたはこのようにそれを行うことができます:
$(function() {
$(window).bind('beforeunload', function() {
setTimeout(function() {
setTimeout(function() {
$(document.body).css('background-color', 'red');
}, 1000);
},1);
return 'are you sure';
});
});
最初のsetTimeout
メソッド内のコードには1ミリ秒の遅延があります。これは、関数をUI queue
に追加するだけです。 setTimeout
は非同期で実行されるため、Javascriptインタープリターはreturn
ステートメントを直接呼び出して続行し、ブラウザーがmodal dialog
をトリガーします。これはUI queue
をブロックし、モーダルが閉じられるまで、最初のsetTimeout
からのコードは実行されません。ユーザーがキャンセルを押すと、約1秒で起動する別のsetTimeoutがトリガーされます。ユーザーがokで確認した場合、ユーザーはリダイレクトされ、2番目のsetTimeoutは起動されません。
私はこの質問が古いことを知っていますが、まだこれで問題が発生している場合に備えて、私にとってはうまくいくと思われる解決策を見つけました、
基本的に、unload
イベントはbeforeunload
イベントの後に発生します。これを使用して、beforeunload
イベントで作成されたタイムアウトをキャンセルし、jAndyの回答を変更できます。
$(function() {
var beforeUnloadTimeout = 0 ;
$(window).bind('beforeunload', function() {
console.log('beforeunload');
beforeUnloadTimeout = setTimeout(function() {
console.log('settimeout function');
$(document.body).css('background-color', 'red');
},500);
return 'are you sure';
});
$(window).bind('unload', function() {
console.log('unload');
if(typeof beforeUnloadTimeout !=='undefined' && beforeUnloadTimeout != 0)
clearTimeout(beforeUnloadTimeout);
});
});
EDIT:jsfiddle here
ありえない。多分誰かが私を間違っていると証明するでしょう...実行したいコードは何ですか?キャンセルをクリックしたときに自動保存しますか?それは直感に反するように思えます。まだ自動保存していない場合は、[キャンセル]を押したときに自動保存しても意味がありません。 onbeforeunloadハンドラーで保存ボタンを強調表示して、ユーザーがナビゲートする前に何をする必要があるかをユーザーが確認できるようにすることもできます。
私はそれが可能だとは思いませんでしたが、このアイデアを試してみましたが、うまくいきました(ただし、これはハックのようなものであり、すべてのブラウザで同じように動作するとは限りません)。
window.onbeforeunload = function () {
$('body').mousemove(checkunload);
return "Sure thing";
};
function checkunload() {
$('body').unbind("mousemove");
//ADD CODE TO RUN IF CANCEL WAS CLICKED
}