2011-12-20 10 views
5

私は、保存されていないデータがあるかもしれないことをユーザーに知らせる警告ウィンドウを開発していますが、ページを離れるときに警告する必要があります。現在、リフレッシュ、ポストバックなどでそうしています。私は、ページがどのようにアンロードされたかを伝える方法があれば、ユーザーがページをアンロードするために何をしているのか詳細を知る方法があるのだろうかと思っていました。 (jqueryソリューション歓迎)。参照用window.onbeforeunload:ウィンドウがどのようにアンロードされたかについての詳細を取得できますか?

コード:

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

答えて

6

  1. 私たちは、上記の回答のように関数のパラメータとして、イベントを渡すことができます。 このイベントは、この イベントに添付されている利用可能な情報に使用できます。
  2. ドキュメントレベルの変数にアクセスできます。

たとえば、document.activeElementは、ページをアンロードした最後の要素をクリックします。

これが役立ちますように!

+0

IE、FF、Chromeで 'document.activeElement'を使用しました。 –

+0

fantastic @RoelvanDuijnhoven !! –

+0

私はこれが受け入れられた答えであるべきだと思います! – EthR

2

短い答え:火災にonbeforeunload引き起こしているものを見つけるための簡単な方法はありません。

長い答え:window.onbeforeunloadハンドラの内部では、いくつかの便利なプロパティを持つ可能性があるwindow.eventオブジェクトにアクセスできます。howウィンドウが閉じています。

たとえば、window.event.srcElementがアンカータグである場合、onbeforeunloadイベントがクリックされたアンカータグによって起動していることがわかります。

MSDNのeventページとonbeforeunloadページを参照してください。

編集:私は出くわしてきたいくつかの詳細情報 - あなたはポストバックを引き起こすASPコントロールを無視したい場合は、「__EVENTTARGET」隠された入力を調べることができます

。この入力に空の文字列値がない場合、ページはASPコントロールによってポストバックされます。

また、keyCodeプロパティ(F5キーが押されている場合はリフレッシュ)またはマウスの位置を確認して、X(閉じる)ボタンがクリックされているかどうかを確認することもできます。

+0

いいえ、window.onbeforeunloadの対象は常にwindowです。 – kennebec

+0

私はイベントターゲットではなくsrcElementプロパティを調べると述べました。 – jbabey

+0

window.event.srcElementはInternet Explorer専用ですか?私が試してみると、Firefoxで何の結果も得られません:window.onbeforeunload = function(){alert(window.event.srcElement)} – Maxx

2

ユーザーがフォームの入力フィールドからEnterキーを押したときに、私は偶然の問題に遭遇していました。フォームが提出され、onbeforeunloadイベントが発生しました。私は、enterkeyコードをフィルタリングして、入力上のkeydownイベントでメッセージを表示しないようにフラグを設定しようとしました。これは、onbeforeunloadイベントが発生し、フラグが設定されていないときまでトリガされませんでした。

次に、jbabeyが示唆しているように_EVENTTARGETを調べました。フォームが送信されている場合は、そのフィールドに値があり、リフレッシュされていれば値はありません。

したがって、onbeforeunloadイベントの_EVENTARGETフィールドに値があるかどうかを確認することで、フォームからの入力がポストバックを引き起こしているかどうかを判断できます。

ここに私のコードです。我々は物事の下に行うことができますbeforeunloadイベントに

  window.onbeforeunload = function (e) { 
      if ($('[id$=__EVENTTARGET]').val().indexOf('btnValidateMaterials') != -1) { 
       confirmExit = false; 
      } 

      if (DateOrQtyHasChanged() && confirmExit) { 

       if (/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { 
        var message = $('[id$=hfLeaveMessageFF]').val(); 
        if (confirm(message)) { 
         history.go(); 
        } 
        else { 
         window.setTimeout(function() { 
          window.stop(); 
         }, 1); 
        } 
       } 
       else { 
        var message = $('[id$=hfLeaveMessage]').val(); 
        return message; 
       } 
      } 
     } 
0

アクティブな要素は有効な解決策ではないと思います。

私は「オープンで無料」の解決策にはコメントできません。評判はありません。

document.getActiveElementは、ドキュメント内で現在フォーカスされている要素を取得します。リンクにフォーカスがあり、F5キーを押すか、タブを閉じると、アクティブな要素がリンクになります。

関連する問題