JavaScript, browsers, window close - send an AJAX request or run a script on window closing

前端 未结 9 1054
梦毁少年i
梦毁少年i 2020-11-22 04:40

I\'m trying to find out when a user left a specified page. There is no problem finding out when he used a link inside the page to navigate away but I kind of need to mark up

9条回答
  •  爱一瞬间的悲伤
    2020-11-22 05:40

    The selected answer is correct that you can't guarantee that the browser sends the xhr request, but depending on the browser, you can reliably send a request on tab or window close.

    Normally, the browser closes before xhr.send() actually executes. Chrome and edge look like they wait for the javascript event loop to empty before closing the window. They also fire the xhr request in a different thread than the javascript event loop. This means that if you can keep the event loop full for long enough, the xhr will successfully fire. For example, I tested sending an xhr request, then counting to 100,000,000. This worked very consistently in both chrome and edge for me. If you're using angularjs, wrapping your call to $http in $apply accomplishes the same thing.

    IE seems to be a little different. I don't think IE waits for the event loop to empty, or even for the current stack frame to empty. While it will occasionally correctly send a request, what seems to happen far more often (80%-90% of the time) is that IE will close the window or tab before the xhr request has completely executed, which result in only a partial message being sent. Basically the server receives a post request, but there's no body.

    For posterity, here's the code I used attached as the window.onbeforeunload listener function:

      var xhr = new XMLHttpRequest();
      xhr.open("POST", );
      xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
      var payload = {id: "123456789"};
      xhr.send(JSON.stringify(payload));
    
      for(var i = 0; i < 100000000; i++) {}
    

    I tested in:

    Chrome 61.0.3163.100

    IE 11.608.15063.0CO

    Edge 40.15063.0.0

提交回复
热议问题