【问题标题】:How to know if the network is (dis)connected?如何知道网络是否(断开)连接?
【发布时间】:2011-03-01 20:19:12
【问题描述】:

在 Xul 中,我如何知道网络是否(断开)连接?

--更新

使用:

    function observe(aSubject, aTopic, aState) {
        if (aTopic == "network:offline-status-changed") {
            write("STATUS CHANGED!");
        }
    }
    var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
    os.addObserver(observe, "network:offline-status-changed", false);

以及偏好:

pref("network.manage-offline-status", true);

它不起作用..有一个bug report here,但我认为它与它无关。

--

其实我认为不可能得到通知,因为即使在 Firefox 中我们也不会收到通知,如果用户想让浏览器知道它是“离线工作”,则需要手动标记离线..

--

Firefox“about:config”过滤“离线”字符串的屏幕截图,不幸的是,没有“network.manage-offline-status”:

【问题讨论】:

  • 您是否尝试过将首选项配置为使用网络管理器,并查看这是否会使 Firefox 自动下线?
  • @Neil 看起来没有这样的属性,但我会用现有的“离线”属性检查行为..(见我的截图)
  • 实际上首选项的名称最近更改了,但无论哪种方式,它都应该默认为 true。我已经注意到 nsIIOService2 上的 manageOfflineStatus 属性,您也可以查看它。
  • @Neil 是的,看起来答案是这样的。我找到了this code,但我没有成功使用它的方法。就像他一样ioService.manageOfflineStatus = false;我做了@987654327 @,但我的应用仍然无法知道它是否下线..
  • 这看起来像是将旧首选项移植到新的 nsIIOService2 属性的 Thunderbird 代码。不确定它是否真的与您的问题有关。

标签: javascript xul xulrunner


【解决方案1】:

您应该可以使用 navigator.onLine。这是帮助页面

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

navigator.onLine 是一个属性 保持一个真/假值(真为 在线,离线为假)。这 每当用户更新属性 切换到“离线模式”通过 选择相应的菜单项 (文件 -> 在 Firefox 中脱机工作)。

另一种解决方案(由@Neil 评论):

Components.classes["@mozilla.org/observer-service;1"]
    .getService(Components.interfaces.nsIObserverService)
    .addObserver(myF­unction, "network:offline-status-changed", false);

【讨论】:

  • 这不会告诉你是否有人拉网线,对吗?
  • 你知道我自己也在考虑这个问题,因为即使我的应用程序也不总是知道网络电缆被拉断,直到它们超时或没有有效的 IP 地址。恐怕我没有更好的答案给你:(
  • 也许我使用了错误的短语,我的意思是如何知道它是否“变得”断开连接。如前所述,如果电缆被移除,我需要知道。但也许唯一的解决方案是每秒查询此属性的脚本..
  • 是的,看起来可用的方法是检查 setInterval 函数中的属性,正如this link(在您的链接上找到)所说。但是,另外,我会在将您的答案标记为正确之前等待,因为也许有人有更好的解决方案..
  • 上线下线有network:offline-status-changed观察者通知。如果您还将 network.manage-offline-status 首选项设置为 true(并且如果您的平台支持它),那么离线状态将反映操作系统的想法。
【解决方案2】:

我发现最好的方法是使用以下javascript代码,其行为类似于ping,并在一些大网站上进行测试,并假设如果它们都没有回答,则必须断开网络。

var ping = {};
ping = {
    img:null,
    imgPreload:null,
    timer:null,
    init:function() {
        var sess = new Date();
        var nocache = sess.getTime();
        var imguri = ping.img+"?time="+nocache;
        var ping.imgPreload = new Image();
        ping.imgPreload.onload = function() {
            clearTimeout(ping.timer);
            ping.timer = null;
            alert("Domain is available");
        };
        ping.imgPreload.src = imguri;
        ping.timer = setTimeout("ping.fail_to_ping()",60000);
    },
    fail_to_ping:function() {
        clearTimeout(ping.timer);
        ping.timer = null;
        ping.imgPreload = null;
        alert("Ping to domain failed!");
    }
};

(来自http://crynobone.com/ci/index.php/archive/view/852

--更新

但是,由于它不是一个可靠的解决方案(因为您不能相信图像会永远在网站上),最好的解决方案可能是开发一个新的 XPCom 组件。

【讨论】:

  • 好的,这仅适用于图像 url,我需要类似的东西用于 html 页面..
  • @Tom:这个解决方案实际上非常简洁。图像只是检查连接是否存在。之后,您可以加载您的 html 页面,因为您已确认连接。
  • @Tokimon 这不是一个可靠的解决方案,我不能依赖网络上的任何图像始终存在。
  • @Tom: True...AJAX 可能会有所帮助。您只需要连接到您拥有的页面即可进行测试...
  • @Tokimon 你是指我的应用程序页面之一,还是我网站的页面?如果是第二个,我不能依赖我的网站将永远运行。如果是第一个,它不会使用互联网连接到我自己的应用程序..
【解决方案3】:

嗯...根据 HTML5(阅读 echmascript 5),on-/offline 事件可用。

Mozilla Hacks查看它

2011 年 4 月 20 日编辑:
我刚刚遇到了这个答案的更新,当我在 43:36 左右观看来自 MS MIX11 的播客时:
http://channel9.msdn.com/Events/MIX/MIX11/HTM14,讲师实际上是在谈论 window.navigator.onLine 属性,他用它来检测是否浏览器(和计算机)在线。然后他再次上线时使用online事件做一些事情。

不过,此方法仅适用于现代浏览器。所以 IE 8 及以下版本必须轮询连接。

【讨论】:

  • 根据this page IE 8+ 和 FF 3+​​ 支持此事件
  • 很高兴知道!不幸的是,Mozilla 页面上的示例总是向我显示“在线”。即使我在拔下物理电缆的情况下打开文件。
  • 另外,带有 google chrome 的 html5 标签也不起作用。它说你必须点击“文件->离线”来切换,但谷歌浏览器没有这个选项,它可能不会识别失去连接。伤心,看起来是个不错的解决方案..
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多