window.onbeforeunload 関数が IE で正しく実行されません。一部の部分的なポストバックも「ページを離れようとしている」と見なされるためです。ページ上のリンクに href="javascript:...." が含まれている場合 (ASP.Net LinkButton はこのようにレンダリングされます)、IE はリンクがクリックされたときにウィンドウ アンロード イベントを誤って起動します。だから、私はdirtyflag変数を保持して追加しました
var __ignoreDirtyFlag = false;
$(document).ready(function () {
if ($.browser.msie) {
$('[href^="javascript:"]').bind('click.ignoreDirtyFlag', function () {
__ignoreDirtyFlag = true;
});
}
});
ページが読み込まれると、 href^="javascript:" で始まるリンクにその機能が割り当てられます。リンクがクリックされると、__ingoreDirtyFlag 変数が true になります。その後追加
window.onbeforeunload = function globalWindowUnload() {
if (!__ignoreDirtyFlag && isDataFilled == true) {
return "You have unsaved changes on this page. If you leave this page, those changes will be lost.";
}
__ignoreDirtyFlag = false;
return;
};
ページで使用した ASP 更新パネルがある場合、リンクへの上記の関数バインディングは削除されます。そのため、更新パネルが更新されたときに、関数をリンクに再度バインドする必要があります。
それで、
function foo() {
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
}
function endRequestHandler(sender, args) {
// Do your stuff
if ($.browser.msie) {
$('[href^="javascript:"]').bind('click.ignoreDirtyFlag', function () {
__ignoreDirtyFlag = true;
});
}
}
と
body タグの onload メソッドには foo() メソッドを割り当てました。
<body onload="foo()">
このハックは IE とすべてのブラウザーで正常に動作します :) ありがとう