views:

329

answers:

1

My Javascript needs to send some data to a server when the page closes, which I currently do with a synchronous AJAX (SJAX?) request in window.onbeforeunload. The problem with this, of course, is that if my server takes too long or the network connection dies, the browser freezes.

From what I've read, it's not possible to specify a timeout for synchronous AJAX requests, and asynchronous AJAX requests don't work on window.onbeforeunload. My best guess at how to solve this would be to use an asynchronous request, and then lock up the browser for some time to let the request finish:

window.onbeforeunload = function() {
  doSomeAjax(); // asynchronous request

  var now = new Date();
  var time_limit = now.getTime()+2000; // 2,000 ms
  while(now.getTime() < time_limit) {
    now = new Date();
  }
}

Would this work? Are there any potential issues with this method?

A: 

Your problem is that the browser freezes, and you're trying to solve it by manually freezing the browser in a loop. That will also freeze the UI thread, so that's not a potential problem, that's a definite problem.

Since the browser is closing, I guess you don't need to receive any feedback from the AJAX responses, to update the page being closed? In that case, perhaps you could solve your problems by injecting IMG tags into, say, a hidden DIV, with their src properties set to the URL you want to request.

David Hedlund
Will the browser still fetch the "image" if it's in a hidden div and the window/tab is closing?
igul222
i imagine it might. but you'd have to do your own experimentation to find out for sure, i've never had the reason to try this out on my own.
David Hedlund