22

AJAX ベースのグリッド コントロールがあります。

window.onbeforeunload イベントにフックして、保存されていないデータがあるかどうかを確認し、保存されている場合は、"Are you sure you want to navigate away... you have unsaved data..." というメッセージを表示します。

これはすべて良いことです。

ただし、AJAX 呼び出しも window.onbeforeunload をトリガーするため、グリッドに保存されていないデータがあり、AJAX 呼び出し (別のグリッドの行を削除するなど) を行うと、ユーザーは「離れて移動してもよろしいですか...あなた保存されていないデータがあります...」というメッセージは良くありません。

AJAX 呼び出しの onbeforeunload イベントを抑制することは可能ですか? または、呼び出しがAJAX 呼び出しであることを検出することは可能ですか? そうしないと、ハッキングする必要があります。

ありがとう

4

9 に答える 9

30

ハイパーリンクによってポストバックをトリガーしたい場合は、簡単な回避策があります:

<a href="javascript:submitFunction();">Submit</a>

また

<a href="javascript:;" onclick="submitFunction();">Submit</a>

このコードを使用してください:

<a href="#" onclick="submitFunction();">Submit</a>

ハイパーリンクの href-attribute のコンテンツが現在のページでない場合 (鋭い文字が示す)、IE は onbeforeunload イベントを発生させるようです。

于 2010-03-24T13:52:45.240 に答える
5

私はこのようなことをしました:

body タグの内側:

  var allowConfirm = true;

  window.onbeforeunload = confirmExit;
  function confirmExit()
  {
    if(allowConfirm)
        return "Are you sure you want to navigate away from this page?";
    else
        allowConfirm = true;
  }

ログアウトするときは、次のスクリプトを呼び出します。

allowConfirm = false; window.location.href を返します。

于 2009-11-14T13:27:14.650 に答える
2

これは本当に奇妙です。あなたの Ajax 呼び出しは新しいリンクをロードしていませんか?

この関連する仕様を必ずお読みください: onbeforeunload 仕様

Ajax 呼び出しが、To invokeテーブルにリストされているアクションのいずれかをトリガーする可能性があるかどうかを確認します。

于 2009-02-11T16:51:59.480 に答える
2

IE6 または href の場合、ポストバック関数をフックできます。つまり、ポストバック関数がWebForm_DoPostBackWithOptionsJquery を使用している場合は、以下のコードを上記のコードに追加します

var DoPostBackWithOptionsHook = null;

$(document).ready(function(){
  DoPostBackWithOptionsHook = WebForm_DoPostBackWithOptions;
  WebForm_DoPostBackWithOptions = WebForm_DoPostBackWithOptionsHook;
}

function WebForm_DoPostBackWithOptionsHook(options) {
    var navigateAwayFlag = $("input[id*='navigateAwayValue']");
       if (navigateAwayFlag.length > 0) {
           navigateAwayFlag[0].value = "false"; }

    return DoPostBackWithOptionsHook(options)
}
于 2011-06-09T21:41:45.533 に答える
0

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が発生する前に、ハイパーリンククリックを介してフラグの値を変更する方法を見つける必要がある場合があります。

于 2009-07-21T18:14:09.220 に答える
0

それは不可能です。ブラウザの更新ボタンが押されたかどうかを確認する方法はありません。

于 2012-07-24T04:07:06.387 に答える
0

これは実際に機能します:

 OnClientClick="eval(this.href);return false" 
于 2010-03-25T17:46:51.037 に答える
0

この問題の 1 つの回避策は、jquery を使用してハイパーリンク タグのクリック イベントで submitFunction() を呼び出し、ハイパーリンクから href 属性を削除することです。

于 2012-06-09T05:55:52.440 に答える