7

ページをアンロードする前にサーバーに投稿しようとしていますが、これに従いましたが、正常に動作しています。私の問題は、window.unload の $.postがアンロード後にトリガーされることです。サインアウト リンクを使用して試し、ログを確認したところ、次の結果が得られました。

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'

最初の部分はサインアウトで、ユーザーはルートにリダイレクトされ、ポスト (「/unloading」) を実行します。

「/unloading」を最初に実行してから、アンロード アクションが何であれ実行する方法はありますか?

これをjquery投稿として持っています

$(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'
    }
  }

アップデート

だから私はajaxリクエストをbeforeunloadに転送しましたが、それは機能していましたがreturn null、表示されているダイアログボックスを削除する必要がありました.このページを離れたい」)。結果は次のとおりです。

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でのみ試しましたが、期待どおりに機能しています。まだ他のブラウザで試す必要があります。

4

3 に答える 3

9

beforeUnloadイベントを試す

アンロード イベントの正確な処理は、ブラウザーのバージョンごとに異なります。たとえば、Firefox の一部のバージョンでは、リンクがたどられたときにイベントがトリガーされますが、ウィンドウが閉じられたときにはトリガーされません。実際の使用では、サポートされているすべてのブラウザーで動作をテストし、独自の beforeunload イベントと対比する必要があります。

アップデート

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

更新 2

ポップアップを無効にするには、コールバック関数からAre you sure that you want to leave this page?戻ってみてくださいnullbeforeUnload

更新 3

クロスブラウザーの互換性については、これを確認してください

于 2012-12-20T02:49:26.363 に答える
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に切り替えると問題が解決しました。

于 2012-12-20T16:38:19.070 に答える
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フォーラムのディスカッションも参照してください。

于 2012-12-21T09:17:15.113 に答える