2011-03-30 52 views
2

目前我正在開發一個用戶通知警報消息功能。的jQuery/JavaScript的setInterval的

我設法利用setInterval來控制我的Ajax調用(檢查是否有用戶的任何通知MSG)。但我的問題是,我只是想通知消息僅 頁面上出現一次(現在它在屏幕上顯示多個通知提醒MSG)。我知道你可以使用setTimeout來使它只呼叫一次,但我還需要該頁面來檢查每5分鐘是否有新的通知消息警報。

第二個問題是有可能在第一輪調用Ajax調用瞬間,然後將所有其他電話每5分鐘?因爲我希望系統在每次登錄系統後立即檢查,然後每5分鐘進行一次檢查。

這裏是我的代碼

function getAjaxNotice() { 
    $.post("/async/getnotification", {}, 
     function(response) { 
      var notice = $(response); 
      $("#notices").prepend(notice); 
     }); 

    return false; 
} 

setInterval("getAjaxNotice()", 50000); 

回答

9

首先,你應該換你的初始化代碼在一個onload功能:

$(document).ready(function() { 
    // Put all your code here 
}); 

使其顯得一次很容易,使用的.html(),而不是設置內容,而不是增加它:

$("#notices").html(notice); 

第三,作爲樣式註釋,你不應該傳遞一個字符串給setInterval()。相反,傳遞一個函數名稱:

setInterval(getAjaxNotice, 50000); 

最後,要改變現在調用函數,並再次每隔5分鐘後,使用:

// Set the timer 
setInterval(getAjaxNotice, 50000); 
// Call it once now 
getAjaxNotice(); 

另外請注意,50000爲50秒,而不是5分鐘。 5分鐘將是5 * 60 * 1000 = 300000.

+0

是的,我同意,在這種情況下,沒有理由將一個字符串傳遞給setInterval。除非有一些可以使用的情況,否則你應該嘗試傳遞一個函數給setInterval/setTimeout。我不確定傳入字符串是否會在引入「嚴格模式」時起作用,我認爲嚴格模​​式不允許使用eval。 – 2011-03-30 18:01:06

2

幾件事情......

setInterval("getAjaxNotice()", 50000); 

是不是5分鐘。

5分鐘= 300000毫秒。

,如果你想讓它立刻運行,然後實現它每5分鐘就可以簡單地做

$(document).ready(function() { 
    getAjaxNotice(); 



     function getAjaxNotice() { 
      $.post("/async/getnotification" , 
      {},        
      function(response) 
      { 
        var notice = $(response); 
        $("#notices").prepend(notice); 
      }); 
      return false;      
     } 

     setInterval(getAjaxNotice(), 300000); 

}); 
2

對於第一個問題,你應該從setInterval被存儲返回值,然後調用clearInterval(myIntervalId)當你會收到一個提醒。

對於第二個問題,您可以在正文裝載過程中調用getAjaxNotice一次,然後如果沒有收到警報,請在該點呼叫setInterval

+0

是的,它是存儲返回值絕對好。特別是如果您需要在某個時候取消定時器。我不知道每次打電話後我都會清除它。這基本上與調用setTimeout(functionX,timeoutPeriod)相同,然後在functionX中調用setTimeout(functionX,timeoutPeriod)。所以我會說清楚你完成這個時間間隔的時間。 – 2011-03-30 18:04:26

+0

@Mark我認爲我的帖子不太清楚;我原本打算在收到警報時(而不是在每次通話後)清除間隔。OP似乎要停止在這一點上查詢。 – dlev 2011-03-30 18:53:32

+0

啊我明白了。好點子。 – 2011-03-30 18:56:35

2

setInterval的時間以毫秒爲單位。

5 minutes * 60 seconds * 1000 milliseconds = 300000ms 

另外,我建議你傳遞一個函數來setInterval不是一個字符串,這樣就可以避免的eval隱含使用。

setInterval(getAjaxNotice, 300000); 

要調用getAjaxNotice在頁面的開始,把它放在一個ready塊。

$(function(){ 
    getAjaxNotice(); 
}); 
1

在您的情況下,您聽起來像是在處理一些問題。因此,使用當前的方法,你可以開始讓你的Ajax調用,並按照它與一組超時:

getAjaxNotice(); 
setTimeout("getAjaxNotice()", 300000); 

其次,確保用戶收到的郵件只有一次,如果你有某種類型的「可以輕鬆完成消息確認「事件。假設您的用戶可以在多臺計算機上打開瀏覽器,如果您讓用戶單擊消息或單擊確定按鈕,或者執行一些操作以確認他們收到了消息,則可以觸發另一個Ajax調用以從緩衝區中刪除該消息在你的服務器上,但仍然顯示在所有打開的瀏覽器上。本地瀏覽器只會顯示一次,因爲如果消息是重複的(基於對您的應用程序有意義的事情),您可以阻止在客戶端顯示它。

但是,您應該查看長輪詢和COMET,http://en.wikipedia.org/wiki/Comet_(programming) 。彗星是圍繞服務器端事件向Web瀏覽器推送通知的概念,與Web瀏覽器不斷向服務器請求更改相反。

由於Web框架和瀏覽器的限制,這是通過一些技術完成的,但長投票似乎是最普遍的。 HTML5和websockets正在嘗試做出一些可能會阻止輪詢一起進行的更改,但尚未提供。

長輪詢,http://en.wikipedia.org/wiki/Push_technology和基於COMET的架構已被meebo和facebook等公司使用。不要在此引用我,但出於某種原因,我傾向於相信Facebook使用基於Erlang的網絡服務器來提供他們的聊天消息。 Erlang和NodeJs只是一些解決方案,您可以使用這些解決方案構建輕量級Web服務器,該服務器可以很好地處理服務器上的大量輪詢請求。

你一定要自己閱讀所有這些東西,因爲有大量的信息可用。我已經在Amazon EC2上創建了一個NodeJs服務器,因爲我傳統上是一個.NET作業,並且不覺得IIS是支持使用長輪詢的.net應用程序的長輪詢功能的正確解決方案,而且我不得不說我喜歡NodeJs很多。加上JavaScript語言比我對Erlang的有限知識更加熟悉。