【问题标题】:Onunload, onbeforeunload - guidance requestedOnunload, onbeforeunload - 请求指导
【发布时间】:2013-05-21 11:03:19
【问题描述】:

我有一个网络服务器,可以为特定学科的学生生成问题。网络服务器需要跟踪每个学生在一组特定问题上花费了多少时间。

网页有一个“完成”按钮,当按下该按钮时,会将统计信息发送到服务器。

但是,如果学生离开页面或关闭浏览器窗口而不按“完成”,我也希望网络浏览器发送统计信息。

为此,我计划让“onunload”或“onbeforeunload”向服务器发送一个带有相关信息的Ajax 请求。但显然不同的浏览器并不完全支持这些事件,而且在事件处理程序中可以做的事情也有限制。当然,如果与服务器的通信失败,我不希望浏览器冻结。

所以,我需要一些关于最佳方式的建议。

【问题讨论】:

  • 出于这个原因,我使用onbeforeunload 来发送AJAX 请求,并且在主流浏览器中都可以使用。我不能给你一个我测试过的明确清单,但你应该知道它以前做过。
  • 我用过的软件,回想起来可能有这个功能。我记得对可以使用的浏览器有限制。这是不诚实的,但我倾向于使用基本上说的话。 "需要符合标准的浏览器。您必须使用 xx、yy 或 zz 浏览器才能完成此测试。其他浏览器无法保证您答案的隐私,因此不支持"
  • 你不能实现浏览器不支持的东西(卸载时的 AJAX)。与其在卸载时发送数据,不如定期向服务器发送数据。然后,即使使用任务管理器关闭浏览器,或者如果他拔下(网络)电缆,您仍然有一些数据。
  • @RichieHindle:在onbeforeunload 上执行 AJAX(或者更确切地说是“SJAX”,因为您只能执行同步请求)不是一个好主意,如果浏览器可能有一点延迟只需忽略该功能,因为这将冻结 UI,直到网站完成对用户不太友好的请求的处理。

标签: javascript ajax onbeforeunload onunload


【解决方案1】:

如果我想确保处理所有“特殊事件”,我会从网页向服务器发送勾选“请求”。粒度取决于跟踪要求、负载以及是 Intranet 还是 Internet 应用程序;可以是几秒钟甚至一分钟。因此,即使浏览器/操作系统/网络崩溃,您也可以跟踪在页面上花费的时间。

【讨论】:

  • 这可能是最好的方法。谢谢你,彼得福尔迪。 (系统允许我在几个小时内奖励赏金。)
【解决方案2】:

最好的实现方式是使用周期更新。当用户以任何方式断开连接时,这几乎可以保证您拥有一些相关数据。

实现非常简单,您可能必须重构一些逻辑以发送周期更新而不是一次发送所有内容。

function sendStatistics()
{
    // ajax and what not
}

setInterval(function(){
    sendStatistics();
}, 1000);

另一种使其工作的方法是在 beforeunload 中进行 ajax 调用并使其同步。这将在通话期间冻结浏览器,并且仅在导航或关闭浏览器时才有效,我不推荐这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    相关资源
    最近更新 更多