ASP.NET AJAXの部分的なポストバックについて話している場合、私は今日もこの動作に遭遇し、まったく同じことをしました。(そうでない場合は、私の投稿を完全に無視してください。)
これまでの私の経験では、部分的なポストバックが入力によってトリガーされた場合、部分的なポストバック中にonbeforeunloadは起動しないようですが、部分的なポストバックがハイパーリンクによってトリガーされた場合は起動します。アンカータグ内の何かをクリックすると、ブラウザはナビゲートしていると想定しているようです(IEとFireFoxでのみテストされていますが、そうです)。
ページに特定の非表示フィールドがあるかどうかは、ナビゲートアウェイ警告を表示するのが適切な場合にクライアント側を判断するためにすでに使用していたので、非表示フィールドの値のチェックをに追加するだけでこれを修正できました。 onbeforeunloadのif条件、およびPageRequestManagerのBeginRequestハンドラーとEndRequestハンドラーにフックして値を設定します。これにより、部分的なポストバック中の警告が事実上無効になります。チェックしたいより具体的なものがある場合は、ここにさらに複雑なロジックを追加できます。
これは本当に単純化されたコードサンプルです。(私がそれが機能しないところまでペアリングして検閲した場合は申し訳ありませんが、それはあなたにアイデアを与えるはずです。)
window.onbeforeunload = checkNavigateAway;
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(onBeginRequest);
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest);
function onBeginRequest(sender, args) {
var navigateAwayFlag = $("input[id*='navigateAwayValue']");
if (navigateAwayFlag.length > 0) {
navigateAwayFlag[0].value = "false";
}
}
function onEndRequest(sender, args) {
var navigateAwayFlag = $("input[id*='navigateAwayValue']");
if (navigateAwayFlag.length > 0) {
navigateAwayFlag[0].value = "true";
}
}
function checkNavigateAway() {
var navigateAwayFlag = $("input[id*='navigateAwayValue']");
if (navigateAwayFlag.length > 0 && navigateAwayFlag[0].value == "true")
{
return "Warning Text";
}
}
編集:悪いニュース。上記はIE6では機能しないようです。Firefoxとは異なる順序でイベントを発生させるように見えるため、onbeforeunloadはAJAXbeginRequestの前に発生します...onbeforeunloadが発生する前に、ハイパーリンククリックを介してフラグの値を変更する方法を見つける必要がある場合があります。