4

かなりの作業を行うページがあり、ユーザーが警告を受けずにそのページから移動できるようにしたくありません (ブラウザを閉じる、戻るボタンを押すなど)。onbeforeunload イベント (これは IE 固有のものであり、プロジェクトが ActiveX を多く使用しているため、私にとっては問題なく機能すると思います) がうまく機能することがわかりました。

問題は、ユーザーが右上隅にある小さな「ヘルプ」アイコンをクリックして、いつでもヘルプ ウィンドウをポップアップできるようにすることです。これにより、メイン ウィンドウがどこにも移動せず、ページがアンロードされなくても、onbeforeunload が発生します。

onbeforeunload イベントの実行時に実行される JavaScript 関数は、テキストを event.returnValue に入れるだけです。どういうわけか、ヘルプ アイコンがクリックされたものであることを確認できた場合、その状況でテキストを event.returnValue に入れることはできませんでした。しかし、どうすればページにそれを理解させることができるでしょうか?

4

4 に答える 4

8

推測してみましょう: ヘルプの「アイコン」は、実際にはjavascript:URL へのリンクですか? 実際のボタン、実際のリンクに変更するか、少なくとも機能を onclick イベント ハンドラーに配置します (これにより、既定の動作が妨げられます)。問題が解決しました。

<!-- clicking this link will do nothing. No onbeforeunload handler triggered. 
Nothing. 
And you could put something in before the return false bit...
...and the onunload handler would still not get called... -->
<a href="http://www.google.com/" onclick="return false;">blah1</a>
<!-- this should also do nothing, but IE will trigger the onbeforeunload 
handler -->
<a href="javascript:void(0)">blah2</a>
于 2008-09-11T22:39:50.763 に答える
2

編集:以下の私の「回避策」は、私の理解不足に基づいて、完全にやり過ぎです。上記の Shog9 の回答を参照してください。

わかりましたので、質問を書いている間に、今のところうまくいく回避策を思いつきました。

アイコンがホバーされているかどうかのブール値として機能するグローバル JavaScript 変数を配置しました。次に、画像の onmouseover および onmouseout イベントにイベントを関連付け、この値を設定する関数を記述します。最後に、event.returnValue を設定する前にこの値をチェックする onbeforeunload を処理する関数をコーディングします。

おそらく完璧な回避策ではありませんが、今のところは機能します。

于 2008-09-11T22:22:27.653 に答える
0

インターネットでは、次のようなものを使用することを提案する多くの人々を見つけるでしょう

window.onbeforeunload = null

しかし、これはIE6では機能しません。イベントオブジェクトのMSDNドキュメントを読んで、解決策だと思ったevent.cancelBubbleプロパティへの参照を見つけました。しかし、「event.cancelBubble=true」の設定は役に立たないことを指摘した Orso のおかげで、確認プロンプトを取り除く方法は、return ステートメントを完全に除外することです。何かを返すかどうか。以下の例では、コード ビハインドに JavaScript コードをプログラムで追加します。

Page.ClientScript.RegisterStartupScript(typeof(String), "ConfirmClose", @"  <script>        window.onbeforeunload = confirmExit;        function confirmExit()      {           if(postback == false)               return ""Please don't leave this page without clicking the 'Save Changes' or 'Discard Changes' buttons."";                                                      }       </script>");

次に、ヘルプ ボタンに次の aspx マークアップが含まれます。

OnClientClick="postback=true;return true;

これにより、'postback' 変数が true に設定されます。これは、confirmExit() 関数で取得され、イベントをキャンセルする効果があります。

これが役に立つことを願っています。テスト済みで、IE6 および FF 1.5.0.2 で動作します。

于 2009-01-06T03:40:43.147 に答える
-1

少し不格好な方法がありますが、ほとんどの場合に機能します。

1 つの 100% 単一 FRAME を持つ FRAMESET を含む「保留」ポップアップ ページを作成し、通常の onUnload および onbeforeUnload イベント ハンドラを HEAD に配置します。

<html>
<head>
<script language="Javascript" type="text/javascript">
  window.onbeforeunload = exitCheck;
  window.onunload = onCloseDoSomething;

  function onCloseDoSomething()
  {
  alert("This is executed at unload");
  }

  function exitCheck(evt)
  {
  return "Any string here."}
  </script>
  </head>

    <frameset rows="100%">
    <FRAME name="main" src="http://www.yourDomain.com/yourActualPage.aspx">
    </frameset>
<body>
</body>
</html>

このメソッドを使用すると、外枠の onUnload または onbeforeUnload イベントが発生することなく、表示したい実際のページを自由に使用し、ポスト バックし、ハイパーリンクをクリックすることができます。

外側のフレームが更新されるか、実際に閉じられると、イベントが発生します。

私が言ったように、完全な証明ではありませんが、クリックまたはポストバックごとにイベントの発生を回避します。

于 2008-10-21T10:42:42.003 に答える