I am trying to do a post to server before unloading a page and I followed this and it’s working fine. My problem is the $.post on window.unload is triggered after it has unloaded. I tried it with a signout link and checking on my logs, I get the following:
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'
First part is the signout and then user gets redirected to root then it runs the post (‘/unloading’).
Is there a way to make the ‘/unloading’ execute first then execute whatever the unload action was?
I have this as my jquery post
$(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'
}
}
Update
So I did transfer the ajax request to beforeunload and it was working but I had to do a return null to remove the dialog box appearing because if I don’t, the ajax was still triggering on popup of dialog (even without answering “yes/no i want to leave this page”). Result is this:
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
Also, I have only tried it with Chrome for now and it’s working as expected. Yet to try on other browsers.
Try the
beforeUnloadeventUPDATE
The unload event is triggered when the page has unloaded.
UPDATE 2
To disable the
Are you sure that you want to leave this page?popup try returningnullfrom thebeforeUnloadcallback functionUPDATE 3
Check this for cross-browser compatiblity