2008-09-11 10 views
3

私はかなりの作業をしているページを持っており、警告を表示せずにそのページ(ブラウザを閉じる、ヒットバックボタンなど)からナビゲートすることはできません。私は、プロジェクトが大量のActiveXを使用しているので、onbeforeunloadイベント(IE固有のものだと思います。特定の要素に対してonbeforeunloadをオーバーライドすることはできますか?

問題は、右上の小さな「ヘルプ」アイコンをクリックしていつでもヘルプウィンドウをポップアップできるようにすることです。これは、メインウィンドウが決してどこにも行き渡らず、ページがアンロードされない場合でも、前回のロードが実行されます。

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

答えて

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> 
+0

実際には本当のリンクだった - 私はonclickがonbeforeunloadの後に発射したという誤った印象にあった。ありがとう。 –

2

編集:私の理解が不足しているため、以下の「回避策」は過剰な過労です。上記のShog9の答えを参照してください。

私が質問を書いている間、私は今のところ回避策を思いつきました。

私は、iconにカーソルを置いているかどうかにかかわらず、大域的なJavaScript変数をbooleanとしてactに入れました。次に、画像のonmouseoverイベントとonmouseoutイベントにイベントを添付し、この値を設定する関数を記述します。最後に、event.returnValueを設定する前にこの値をチェックするonbeforeunloadを処理する関数を記述します。

おそらく完璧な回避策ではありませんが、現在はうまくいくでしょう。

-1

私はちょっと大変ですが、たいていの場合はうまくいく方法があります。

1つの100%単一フレームを持つFRAMESETを含む「保持」ポップアップページを作成し、通常のonUnloadイベントハンドラとonbeforeUnloadイベントハンドラをHEADに配置します。あなたは、見ポストバックと発射される外枠ONUNLOADまたはonbeforeUnloadイベントなしでハイパーリンクをクリックする実際のページを自由に使用することがこの方法を使用

<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> 

外部フレームをリフレッシュするか、実際に閉じた場合、イベントが発生します。

私が言ったように、完全ではありませんが、すべてのクリックまたはポストバックでイベントの発砲の周りを取得します。

+0

フレームが醜いです – ThiefMaster

0

インターネット上のあなたは

window.onbeforeunload = nullを

ようなものを使用するが、これはIE6で私のために動作しません示唆多くの人を見つけるでしょう。イベントオブジェクトのMSDNドキュメントを読んで、私は解決策だと思ったevent.cancelBubbleプロパティへの参照を見つけました。しかし、それを指摘してくれたオルソ氏に感謝します。cancelBubble = true "は役に立ちません。確認のプロンプトを取り除く方法は、return文を完全に除外することです。以下の例では、返すかどうかを決定するフラグとしてブール変数を使用しました。 JavaScriptコードはprogramattically背後にあるコードで:

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; 

が、これは(confirmExitに拾われますtrueに「ポストバック」変数を設定します)機能を持ち、イベントキャンセルの効果があります。

あなたはこれが役立つことを願っています。それはIE6とFF 1.5.0.2でテストされ動作します。

関連する問題