2015-09-12 39 views
-1

我試圖運行Javascript函數來檢查Internet連接狀態。如果用戶連接到互聯網,那麼我不想在屏幕上發生任何事情。但是,如果連接丟失,那麼我想顯示一個div。 (這個div將佔用整個屏幕(這將阻止用戶在後臺與頁面進行交互),直到連接重新建立,一旦連接重新建立,div應該自動消失,用戶應該能夠再次與屏幕上的按鈕進行交互。)如何處理同步aj​​ax調用的結果並根據結果值顯示或隱藏div

爲了實現這一點,我有一個Javascript函數來檢查每秒運行的連接。它通過在PHP文件中使用AJAX帖子,PHP文件回顯「1」回到Javascript,如果函數接收到這個「1」,那麼它知道連接是活動的,如果它沒有收到它那麼它知道連接中斷,它應該顯示div。

該div被稱爲「openOfflineDIV」。

這是我的javascript:

function checkConnection() { 

    if($.ajax({ 
     url: 'php_scripts/checkconnection.php', 
     type: "POST", 
     async: false 
     }).responseText == "1"){ 
      console.log("Connection active");  
     openOfflineDIV.style.visibility = 'hidden'; 
           } 
     else{ 
      console.log("Connection lost"); 
      openOfflineDIV.style.visibility = 'visible'; 
             } 
     }; 

我的PHP文件:

<?php echo '1'; ?> 

我的HTML頁面的相關部分:

//Head content (file containing 「checkConnection();」 is included here) 
<body> 

<script> 
setInterval(function(){ 
     checkConnection(); 
    },1000); 
</script> 

//Body content here 

//DIV to show when connectivity is lost: 
<div id="openOfflineDIV" class="modalOfflineDIVDialog"> 
<div id="mfs"> 
<div id="wrapper"> 
<table width="100%" border="0" cellspacing="0" cellpadding="0"> 
    <tr> 
    <td align="center" valign="middle" class="alerttextbig">You have been disconnected from the internet!</td> 
    </tr> 
</table> 
</div> 
</div> 
</div> 
</body> 

當我加載的頁面我看到控制檯每秒都會寫入「Connection active」。但是我也在控制檯中發現以下錯誤:

主線程上的同步XMLHttpRequest由於其對最終用戶體驗的不利影響而被棄用。欲瞭解更多幫助http://xhr.spec.whatwg.org/

看着它後,它似乎是因爲我在我的Javascript有async = false,但是當我刪除它,它仍然無法正常工作。

我在這裏看到的答案:How do I return the response from an asynchronous call? 我試圖改變我的代碼本實施頂端回答:

function checkConnection(result) { 

    if(result == "1"){ 
      console.log("Connection active"); 
     openOfflineDIV.style.visibility = 'hidden'; 
     } 
     else{ 
      console.log("Connection lost"); 
      openOfflineDIV.style.visibility = 'visible';  
             } 
     } 
     foo(checkConnection); 

    function foo(callback){ 
    $.ajax({ 
     url: 'php_scripts/checkconnection.php', 
     type: "POST", 

     success: callback 
    }); 
     } 

這仍然不能正常工作,它不斷書寫「連接丟失」在控制檯中,這讓我認爲它可能不會等待從PHP文件返回的「1」。

我真的很感激任何人可以給我這個幫助,我試着實現我在這裏找到的答案,但到目前爲止一直不成功,先謝謝了!

UPDATE

這是使用@安地列斯的回答我當前的代碼:

function checkConnection() { 
    $.ajax({ 
     url: 'php_scripts/checkconnection.php', 
     type: "POST", 
     success: function() { 
      $("#openOfflineDIV").hide(); 
      console.log("connected"); }, 
     error: function() { 
      $("#openOfflineDIV").show(); 
      console.log("disconnected"); } 
    }).complete(function() { 
     setTimeout(checkConnection, 1000); 
    }); 
} 

$(document).ready(checkConnection); 

出於某種原因,當連接丟失的DIV沒有出現,但「斷開連接」並出現在控制檯每秒都會顯示,並且只要連接處於活動狀態,就會顯示「connected」。

更新2

這是另一種嘗試,以實現相同的結果:

function checkConnection() { 
    $.ajax({ 
     url: 'php_scripts/checkconnection.php', 
     type: "POST", 
     success: function() { 

    document.getElementById('openOfflineDIV').style.display = 'none'; 
    console.log("connected"); }, 

     error: function() { 

    document.getElementById('openOfflineDIV').style.display = 'block'; 
//I have also tried: document.getElementById('openOfflineDIV').style.display = 'inline'; 
    console.log("disconnected"); } 

    }).complete(function() { 
     setTimeout(checkConnection, 1000); 
    }); 
} 

這種方法是成功的一半工作,這意味着如果我瀏覽到我的/#openOfflineDIV網頁地址添加到年底,那麼頁面將在屏幕上顯示div時加載,然後一旦函數開始運行(這意味着一旦它意識到連接處於活動狀態,函數將成功關閉div)後,該頁面會在一秒之後消失。

但該功能的第二部分不起作用,它不顯示互聯網連接丟失時的div。我試過inlineblock方法,但都沒有工作。我很困惑,因爲函數是絕對能夠成功地隱藏div(我認爲這意味着我的定義div的語法是正確的)。

有什麼我在這裏失蹤?可能需要在頁面上添加一個額外的腳本或類似的東西來完成這項工作?

+0

首先,您的主要問題問如何做到這一點同步,然後你問如何異步執行,並且在代碼中,您嘗試對異步代碼的處理是錯誤的,您在調用foo之後已經檢查了從foo中的ajax成功調用checkConnection的內部調用返回的結果 –

回答

0

這將是你的骨骼結構來實現您在線/離線功能

function checkConnection() { 
    $.ajax({ 
     url: 'php_scripts/checkconnection.php', 
     type: "POST", 
     success: function() { $("#openOfflineDIV").hide(); }, 
     error: function() { $("#openOfflineDIV").show(); } 
    }).complete(function() { // this starts the next connection check in 1 second 
     setTimeout(checkConnection, 1000); 
    }); 
}); 

$(document).ready(checkConnection); // trigger the inital connection check on DOMReady 

我做了一個小fiddle它。
只需關閉您的互聯網連接,並應相應地更新狀態(並出於同樣的原因從jsfiddle彈出應出現^^)

+0

Hi @ andreas謝謝你的回答,我試圖實現它,但其中的一部分似乎並沒有爲我工作。我已經添加了兩個console.logs(「連接」和「斷開連接」),它們工作正常,所以它看起來像連接檢查正在工作,但div沒有出現。我在我的問題的最後添加了一個更新,以顯示我的分鐘代碼。我想知道你是否知道爲什麼div沒有出現,並且有另一種顯示/隱藏div的方法嗎?再次感謝! – Emily

+0

如果div用「display:none」隱藏,它應該可以工作。這個ID是否正確?檢查'$(「#openOfflineDIV」).length'屬性來查看選擇器是否找到了某個東西。如果它不是null,那麼你的CSS有一些東西。檢查開發人員工具。 – Andreas

+0

嗨@andreas我已經嘗試過不同的東西,包括從div名稱中刪除''#'',但是我看不到代碼出了什麼問題,並且在控制檯中沒有顯示任何錯誤(console.logs「connected」和「斷開」是唯一顯示的東西)。我一直在用你的代碼嘗試一種不同的方法,並想知道你是否可以看看它?我在「UPDATE 2」下的問題末尾發佈了它。它主要是在工作(div正在消失),但出於某種原因,我無法讓div自己出現而無需直接導航到它。再次感謝您對此的幫助! – Emily