2012-06-15 79 views
1

AIM:我想設置下面的函數來每5秒調用一次。使用qtip。如何從setInterval()調用js函數

變量ALARM_POPUP通過一個shellcript改變每一分鐘,shellcript替換變量上的內容。

CODE:

function popupTXT() 

     { 

       var ALARM_POPUP="Alarm Warning warning "; 

       $('#telecom_1').qtip({content:ALARM_POPUP,style: {name: 'dark', tip: 'topLeft'} }); 

     }; 

我現在用的是下面一個計時器調用。

setInterval("popupTXT()",5000); 

結果:這隻會在刷新瀏覽器時起作用。任何建議,將不勝感激

+0

即使你打電話每5秒你打算如何更新'ALARM_POPUP'內容的功能?它似乎在服務器上生成,但一旦它被下載到瀏覽器,它不會改變,除非你正在做一些AJAX請求 – CodingHamster

+0

@ user628405 ALARM_POPUP的內容是通過使用sed代替當前文本的shell腳本改變的與新的文本。它總是更新,只是jquery沒有刷新窗口而沒有刷新它,我不能這樣做,因爲頁面的其他部分。 – Rhys

回答

5

變量ALARM_POPUP通過shell腳本它取代了每分鐘變化一次內容在變量上。

這意味着要在頁面上看到該更改,必須調用服務器以獲取更新的值。你沒有那樣做。

你可以通過ajax來實現。創建一個服務器端頁面,輸出ALARM_POPUP的原始文本(使用Content-Type: text/plain)或JSON(使用Content-Type: application/json)的新值並觸發ajax調用以獲取該頁面的內容,然後使用它更新qtip。你不會想要setInterval,因爲在調用時間長度不確定的情況下,事情會很快變得混亂。相反,只要在上一個週期完成後啓動一個setTimeout

假設您創建一個updatealarm.xyz頁面(PHP,JSP,ASP.Net,等等),輸出電流ALARM_POPUP價值爲純文本,將看東西這樣的:

(function() 
{ 
    var ALARM_POPUP="Alarm Warning warning "; 

    function updateQtip(popupText) 
    { 
     $('#telecom_1').qtip({content:popupText,style: {name: 'dark', tip: 'topLeft'} }); 
     setTimeout(nextUpdate, 5000); 
    } 

    function nextUpdate() 
    { 
     $.ajax({ 
      url: "updatealarm.xyz", 
      success: function(data) 
      { 
       ALARM_POPUP = data; // Although you don't actually need to update it 
       updateQtip(data); 
      }, 
      error: function() 
      { 
       // Do error handling 
      } 
     }); 
    } 

    updateQtip(); 

})(); 

關於你的原setInterval電話:最好不要將字符串傳入setIntervalsetTimeout;這基本上是做一個eval,這既不必要也不是一個好主意。相反,如上所述,傳入函數引用(例如,函數名稱,不調用())。


重新下方的評論:

我有這個問題,我想知道,如果你提供的PHP文件將是什麼樣子

我有一個例子只做了一點PHP,但我相信它看起來像這樣:

<?php 
    header('Content-Type: text/plain'); 
    echo 'This is the message that will end up in \'data\' in the ajax success handler.'; 
?> 

或if您喜歡使用一個變量來使它更容易爲你的sed腳本:

<?php 
    header('Content-Type: text/plain'); 
    $alarm_popup = 'This is the message that will end up in \'data\' in the ajax success handler.'; 
    echo $alarm_popup; 
?> 
+0

@TJCrowder感謝您的詳細回覆。該變量正在通過shell腳本上的sed命令在html頁面上進行更改。但是這個功能仍然沒有吸收變化。如果我檢查HTML,則代碼已更改爲新的警報內容。 – Rhys

+2

@Rhys:關鍵點是**客戶端與服務器**頁面的副本。當瀏覽器請求該頁面時,服務器會將該頁面的一個*副本*發送給它。你的'sed'腳本改變服務器上的***頁面,而不是客戶端。它不會(也不能)更改頁面的客戶端顯示。這就是爲什麼您必須向服務器請求更新。顯然你不想再向服務器請求整個頁面,所以做一個單獨的頁面。 'sed'腳本*也*更新'updatedalarm.xyz',上面的代碼應該排除,因爲客戶端代碼從服務器請求更新的文件。 –

+0

@TJCrowder這很有道理,謝謝你。我也在這個頁面上運行jquery draggable()。這不會導致問題嗎? – Rhys

5

試試這個:

setInterval(popupTXT,5000); 

Just a sample

瞭解更多關於.setInterval()

+0

@ T.J.Crowder先生,如果我做錯了,請編輯。 – thecodeparadox

+0

@ T.J.Crowder感謝Sir Sir – thecodeparadox

+0

重新閱讀這個問題,雖然你說的最好是使用帶有函數引用的'setInterval'而不是字符串,我不認爲這是OP的問題。 –