如何知道网络是否已连接?

Tom*_*ito 9 javascript xul xulrunner

在Xul中,我如何知道网络是否已连接?

--update

使用:

    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);
Run Code Online (Sandbox Code Playgroud)

和偏好:

pref("network.manage-offline-status", true);
Run Code Online (Sandbox Code Playgroud)

它不起作用..这里有一个错误报告,但我不认为它与它有关.

-

实际上我认为不可能收到通知,因为即使在Firefox中我们也从未收到通知,如果用户希望浏览器知道它处于脱机状态,则需要手动标记"脱机工作".

-

屏幕截图我的Firefox"about:config"过滤"离线"字符串,遗憾的是,没有"network.manage-offline-status":

在此输入图像描述

Ami*_*far 5

您应该能够使用navigator.onLine.这是帮助页面

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

navigator.onLine是一个维护true/false值的属性(对于在线为true,对于离线为false).每当用户通过选择相应的菜单项(文件 - >在Firefox中脱机工作)切换到"离线模式"时,此属性就会更新.

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

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

  • 这不会告诉你是否有人猛拉网线,不是吗? (2认同)
  • 用于上线和离线的"network:offline-status-changed"观察者通知.如果您还将`network.manage-offline-status`首选项设置为true(如果您的平台支持它),则脱机状态将反映操作系统认为它是什么. (2认同)

Tom*_*ito 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!");
    }
};
Run Code Online (Sandbox Code Playgroud)

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

- 更新

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