2012-11-22 2 views
7

ページをアンロードする前にサーバーへのポストを実行しようとしていて、それに続いてthisが問題なく動作しています。私の問題は、window.unloadの$ .postが、の後に読み込まれたです。私は、次を取得し、サインアウトリンクでそれを試してみましたが、私のログをチェック:アンロード後にWindow.unloadがポストします

Started GET "/signout" for 127.0.0.1 at 2012-11-22 00:15:08 +0800 
Processing by SessionsController#destroy as HTML 
Redirected to http://localhost:3000/ 
Completed 302 Found in 1ms 


Started GET "/" for 127.0.0.1 at 2012-11-22 00:15:08 +0800 
Processing by HomeController#index as HTML 
    Rendered home/index.html.erb within layouts/application (0.4ms) 
    Rendered layouts/_messages.html.erb (0.1ms) 
Completed 200 OK in 13ms (Views: 12.9ms) 


Started POST "/unloading" for 127.0.0.1 at 2012-11-22 00:15:08 +0800 
Processing by HomeController#unloading as */* 
    Parameters: {"p1"=>"1"} 
WARNING: Can't verify CSRF token authenticity 
Completed 500 Internal Server Error in 0ms 

NoMethodError (undefined method `id' for nil:NilClass): 
    app/controllers/home_controller.rb:43:in `unloading' 

最初の部分はサインアウトされた後、ユーザーはそれがポストを実行その後、をrootにリダイレクトされます(「/アンロード」) 。

'/ unloading'を最初に実行してから、アンロードアクションが何であれ実行しますか?

私は

$(window).unload -> 
    $.ajax { 
    async: false, 
    beforeSend: (xhr) -> 
     xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')) 
    , url: '/unloading' 
    , type: 'Post' 
    , data: { 
     p1: '1' 
    } 
    } 

私のjqueryのポストとしてこれを持って更新

だから私はbeforeunloadするAJAX要求を転送しなかったし、それが働いていたが、私は、ダイアログボックスを削除するreturn nullをしなければなりませんでした表示されていない場合、ajaxはダイアログのポップアップで(まだ「はい/いいえ私はこのページを残したいです」と答えなくても)引き続きトリガーしていたからです。結果は次のとおりです。

window.onbeforeunload -> 
    $.ajax { 
    async: false, 
    beforeSend: (xhr) -> 
     xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')) 
    , url: '/unloading' 
    , type: 'Post' 
    , data: { 
     p1: '1' 
    } 
    } 
    return null 

また、私はChromeでこれを試しただけで、期待通りに動作しています。しかし、他のブラウザで試してみてください。

答えて

9

は、unloadイベントの正確なハンドリングはバージョンからブラウザの バージョンに変化したbeforeUnloadイベント

を試してみてください。たとえば、Firefoxの一部のバージョンでは、リンクが続いたときには イベントがトリガーされますが、ウィンドウが閉じているときはトリガーされません。 実際の使用では、動作はサポートされているすべてのブラウザ( )でテストし、独自のbeforeunloadイベントとは対照的です。

UPDATE

ページがアンロードしたときにアンロードイベントがトリガされます。

UPDATE 2

beforeUnloadコールバック関数

はUPDATE 3

チェックこれを

+0

申し訳ありませんが、返信が少し遅れていたら。前にbeforeunloadにAjaxブロック全体を追加しようとしましたが、最初に「このページを終了してもよろしいですか?追加されたメッセージとして[オブジェクトオブジェクト]を持つ。私は前に検索し、それはbeforeunloadの目的だと思う...どうすればそれを削除できますか? – index

+0

そして、アンロードイベントは、ページがすでにアンロードされたときにトリガーされるという情報に感謝します。 – index

+0

あなたの 'beforeUnload'関数から' null'を返そうとします。http://stackoverflow.com/questions/1119289/how-to-show-the-are-you-sure-you-want-to-navigate-away-from-このページの先頭に戻る – nickaknudson

4

@NickKnudsonが示唆したように、前にフォームデータをポストバックする "beforeUnload" イベントを使用ウィンドウがアンロードされます。

window.onbeforeunload = function() { 
    $.ajax { 
    async: false, 
    beforeSend: (xhr) -> 
     xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')) 
    , url: '/unloading' 
    , type: 'Post' 
    , data: { 
     p1: '1' 
    } 
    } 
} 

約2週間前と全く同じ状況になり、beforeUnloadに切り替えて問題を解決しました。

+0

ブラウザを体験しましたか?window.onbeforeunloadで問題がありますか? – akamaozu

+0

いいえ、OSXで動作するOperaとブラウザはテストしていません。 Chrome、IE、最近のFFのすべてのバージョンでサポートされています。 – SaschaM78

+0

申し訳ありませんが、返信が少し遅れていた場合。前にbeforeunloadにAjaxブロック全体を追加しようとしましたが、最初に「このページを終了してもよろしいですか?追加されたメッセージとして[オブジェクトオブジェクト]を持つ。私は前に検索し、それはbeforeunloadの目的だと思う...どうすればそれを削除できますか? – index

3

問題は、ウィンドウのunloadイベントは、ウィンドウを閉じる前にAJAX呼び出し(非同期)が完了するのを待たないということです。さらに、jQueryにはbeforeunloadイベントの組み込み処理がないようです。そのため、これを処理するにはネイティブJSコードに戻す必要があります。以下を参照してください:

のCoffeeScriptで書かれた)

window.onbeforeunload = function() { 
    $.ajax { 
     async: false, // Important - this makes this a blocking call 
     beforeSend: (xhr) -> 
      xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')) 
     , url: '/unloading' 
     , type: 'Post' 
     , data: { 
      p1: '1' 
     } 
    } 
}; 

onbeforeunload - ページがアンロードされると、unloadイベントの前に発生させたイベントを。

このトピックについてのこのGoogle Forumの説明も参照してください。

関連する問題