2012-02-10 37 views
1

我想在用户关闭浏览器窗口时通知服务器。在窗口卸载时没有时间发送获取请求

我尝试了所有的

$(window).bind("beforeunload", function() { 
    $.get("${contextPath}/notify?direction=logout"); 
}); 

$(window).unload(function() { 
    $.get("${contextPath}/notify?direction=logout"); 
}); 

$(window).unload(function() { 
    $.ajax({ 
     url: "${contextPath}/notify?direction=logout" 
    }); 
}); 

但既不工作做好了,尽管事实上,它是在手动,它可能说应该。

在Firefox中,我没有只在窗口关闭时发出通知,但在页面刷新时没有通知。在Chrome中我都没有。

我试图在Firebug或Chrome开发人员工具中跟踪此脚本,发现它在跟踪时已开始工作!所以我认为它不能正常工作,因为它没有时间在窗口关闭或导航之前发送请求。

这是真的吗?如何完成我的任务?

SOLUTION

这工作:

$(window).bind("beforeunload", 
    function() { 
     $.ajax({ 
      async: false, 
      url: 'notify' 
     }); 
    } 
); 
+0

首先想到:AJAX是这个工作的错误工具。你应该使用SJAX(同步),AJAX通过定义释放GUI线程来继续处理[在这种情况下是卸载]。 – Shad 2012-02-10 22:18:27

+0

看看这个答案:http://stackoverflow.com/a/9234785/252780 – 2012-02-10 22:20:15

回答

3

这是非常棘手的,因为浏览器不会等待,直到响应来得Ajax请求可能会中止。

你可以在beforeunload事件中尝试这样的事情。

$(window).bind("beforeunload", function() { 
    $.ajax({ 
     async: false,//This will make sure the browser waits until request completes 
     url: "${contextPath}/notify?direction=logout" 
    }); 
}); 
+0

这是不可靠的,虽然你可以“尝试”,它可能工作,它永远不应该在生产环境中使用。 – 2012-02-10 22:46:50

0

你的运气了,这将是不可能的,如果JavaScript的网页上执行卸载阻止了用户退出的页面。

想象一下所有的垃圾邮件。

在某些浏览器上,卸载事件将触发,但在您的脚本和页面清理之间将发生竞态条件。

感谢

0

我不想说这是一个评论,因为我在做这个 场景很长一段时间了。当最终用户意外或故意关闭浏览器时,我会将所有信息保存到服务器 。我 会告诉你..这是工作很好。,

我说工作很好吗?那么它只是在Firefox和IE浏览器。它 在许多其他浏览器(如Opera,Safari)中失败。

所以我的建议是不依赖于这些功能,因为它们只是针对浏览器的 。

1

即使这是可能的,我仍然不会推荐它。 如果你设法得到这个工作,它不会在所有浏览器中工作,我仍然完全建议它。

如果您非常想知道用户何时离开您的域,请使用轮询或带有后备的websockets。

您也可以给cookie一个短暂的超时时间,并在网站上定期更新它们,这样的技巧甚至会起作用。

此外,它在追踪时“开始”工作,因为事件在下一页开始加载之前被触发。已经有一段时间了,但是我上次玩过这些事件,但是一些浏览器可能会在下一页加载时执行代码一段时间。

+0

我的任务不是100%的可靠性,因为我有像你说的备份解决方案。定期轮询的问题是速度不够快。所以我需要一个快速的解决方案,可以与一些浏览器一起使用。 – Dims 2012-02-12 19:02:20

相关问题