2011-03-01 192 views
9

如何在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); 

和偏好:

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

它不工作..有一個bug report here,但我不認爲它有與它有關。

-

其實我認爲這是不可能的通知,因爲即使在Firefox中我們永遠通知,用戶需要「脫機工作」,如果他想在瀏覽器知道手動標記它的下線..

-

截圖火狐 「about:config中」 我爲 「脫機」 字符串,不幸的是,有沒有 「network.manage脫機狀態」 過濾:

enter image description here

+0

您是否嘗試配置首選項以使用網絡管理器,並查看是否會使Firefox自動脫機? – Neil 2011-03-02 19:47:46

+0

@Neil看起來好像沒有這樣的屬性,但是我會用現有的「離線」屬性檢查行爲。(請參閱我的屏幕截圖) – 2011-03-02 20:11:46

+0

實際上,首選項的名稱最近發生了變化,但無論如何它應該默認爲true 。我注意到了nsIIOService2上的manageOfflineStatus屬性,您也可以查看它。 – Neil 2011-03-02 20:34:12

回答

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

--update

但是,因爲它不是一個可靠的解決方案(因爲你不能依靠該圖像將在網站上永遠)最好的解決方案可能是開發一個新的XPCom組件。

+0

好吧,這將只適用於圖片網址,我需要類似的HTML頁面.. – 2011-03-10 14:31:21

+0

@Tom:那麼這個解決方案實際上是非常整潔。圖像的東西只是檢查連接是否存在。之後,您可以加載您的HTML頁面,因爲您已確認連接。 – Tokimon 2011-03-21 00:47:42

+0

@Tokimon這不是一個可靠的解決方案,我不能依賴網絡上的任何圖像始終存在。 – 2011-03-21 12:36:36

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(myF­unction, "network:offline-status-changed", false); 
+2

這不會告訴你是否有人拔掉網線,是嗎? – corsiKa 2011-03-01 20:24:56

+0

你知道我正在考慮這個問題,因爲即使我的應用程序並不總是知道網絡電纜被抽出,直到它們超時或沒有有效的IP地址。恐怕我沒有更好的答案給你:( – 2011-03-01 20:27:07

+0

什麼是今天的倒票?:( – 2011-03-01 20:28:25

0

呃...按照HTML5(閱讀echmascript 5),on-/offline事件可用。

看到它在這裏Mozilla Hacks

編輯20/4/2011:
我只是遇到了一個更新這個答案,當我看着從MS MIX11播客:
http://channel9.msdn.com/Events/MIX/MIX11/HTM14左右時間43:36,講師實際上是在談論window.navigator.onLine屬性,在那裏他用它來檢測瀏覽器(和計算機)是否在線。然後,當他再次上線時,他使用online事件做些事情。

但是,此方法僅適用於現代瀏覽器。因此,IE 8及以下版本必須輪詢連接。

+0

Acording爲[此頁](http://help.dottoro.com/ljnasgpu.php)在IE支持本次活動8+和FF 3+​​ – Tokimon 2011-03-11 12:20:22

+0

好消息!毫無疑問,mozilla頁面上的例子總是向我顯示「ONLINE」。即使我用拔下的物理電纜打開文件。 – 2011-03-11 13:20:47

+0

此外,谷歌瀏覽器的html5標記不起作用。它說你必須點擊「文件 - >離線」才能切換,但這種選項在Google Chrome上不可用,並且可能無法識別連接丟失。悲傷,看起來像一個很好的解決方案.. – 2011-03-11 13:47:21

相關問題