如何跨浏览器检测线上/线下事件?

我试图使用HTML5在线和离线事件准确检测浏览器何时脱机。

这是我的代码:

<script>
    // FIREFOX
    $(window).bind("online", applicationBackOnline); 
    $(window).bind("offline", applicationOffline);

    //IE
    window.onload = function() {
        document.body.ononline = IeConnectionEvent;
        document.body.onoffline = IeConnectionEvent;
    } 
</script>

当我在Firefox或IE上点击“离线工作”时,它可以正常工作,但是当我实际拔下电线时,它有点随机工作。

检测此更改的最佳方法是什么?我想避免重复带有超时的ajax调用。


答案 1

目前在2011年,各种浏览器供应商无法就如何定义离线达成一致。一些浏览器具有脱机工作功能,它们将其视为与缺乏网络访问分开的,这同样与Internet访问不同。整个事情是一团糟。某些浏览器供应商会在实际网络访问权限丢失时更新 navigator.onLine 标志,而其他浏览器供应商则不会。

从规格:

如果用户代理肯定处于脱机状态(与网络断开连接),则返回 false。如果用户代理可能处于联机状态,则返回 true。

当此属性的值更改时,将触发联机和脱机事件。

如果用户代理在用户点击链接或脚本请求远程页面(或知道此类尝试将失败)时不会联系网络,则 navigator.onLine 属性必须返回 false,否则必须返回 true。

最后,规范指出:

此属性本质上是不可靠的。计算机可以在没有互联网访问权限的情况下连接到网络。


答案 2

主要的浏览器供应商对“离线”的含义存在分歧。

Chrome,Safari和Firefox(从版本41开始)将检测您何时自动“离线” - 这意味着当您拔下网线时,“在线”事件和属性将自动触发。

Mozilla Firefox(版本41之前),Opera和IE采用不同的方法,除非您在浏览器中明确选择“离线模式”,否则将您视为“在线” - 即使您没有有效的网络连接。

Firefox/Mozilla 行为有一些有效的参数,这些参数在此错误报告的注释中进行了概述:

https://bugzilla.mozilla.org/show_bug.cgi?id=654579

但是,要回答这个问题 - 您不能依靠在线/离线事件/属性来检测是否存在实际网络连接。

相反,您必须使用其他方法。

这篇 Mozilla 开发者文章的“注释”部分提供了指向两种替代方法的链接:

https://developer.mozilla.org/en/Online_and_offline_events

“如果API未在浏览器中实现,则可以使用其他信号来检测您是否处于脱机状态,包括侦听AppCache错误事件和来自XMLHttpRequest的响应”

这链接到“侦听 AppCache 错误事件”方法的示例:

http://www.html5rocks.com/en/mobile/workingoffthegrid/#toc-appcache

...以及“侦听 XMLHttpRequest 失败”方法的示例:

http://www.html5rocks.com/en/mobile/workingoffthegrid/#toc-xml-http-request

HTH, -- 乍得