在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”:
答案 0 :(得分:5)
您应该可以使用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(myFunction, "network:offline-status-changed", false);
答案 1 :(得分: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组件。
答案 2 :(得分:0)
呃...根据HTML5(阅读回声5),on-/offline
事件可用。
编辑20/4/2011:
当我正在观看来自MS MIX11的播客时,我刚刚遇到了这个答案的更新:
http://channel9.msdn.com/Events/MIX/MIX11/HTM14在时间43:36左右,讲师实际上是在讨论window.navigator.onLine
属性,他用它来检测浏览器(和计算机)是否在线。然后,当他再次上线时,他使用online
事件做某事。
此方法仅适用于现代浏览器。所以IE 8及以下版本必须轮询连接。