2012-12-12 21 views
-2

在堅果殼中,如果用戶不在主頁上,則需要清除名爲newsCheck的函數的間隔。似乎很簡單,我也這麼認爲。這給我造成了巨大的問題。我使用歷史api,這是爲什麼間隔不會在頁面重新加載和更改時清除。如果不符合條件,則清除間隔

這裏是我有離開了

//only run if on home page 
if (url == 'Home' || url == '' || url == 'home' || url == 'home.html' || url == 'Home.html'){ 

    //set up interval handler for cancellation when not on home 
    var handle=self.setInterval(function(){newsCheck()},1000); 

    // ... 

}//close if Home clause 
else 
{ 
    handle = self.clearInterval(handle); 
} 

好不重要的腳本,newsCheck是檢查從通過AJAX查詢(查詢)數據庫中的新信息的功能。當不在家時,這需要取消,因爲不需要它。

歷史API

額外的信息,我需要取消間隔,因爲我用的是歷史API腳本因此新頁面的功能不斷即使我們不在主頁上運行加載。

爲了解決這個問題,我把它放在歷史API的loadContent函數中。

$.ajax({ 
     type: "GET", 
     url: "AJAX/request_feed.js", 
     dataType: "script" 
     }); 

正如你可以看到它運行我們上,使得newsCheck功能可以取消任何網頁。這就是我在上面的腳本中進行網址檢查的原因。

在使用newsCheck函數的腳本中,我將url變量放在(document).ready之前,以便在url更改爲新url時檢索url,因此它不會獲取上一頁的url。然後我們檢查URL和運行腳本,如果在Home,並且如果我們不清除間隔。

+3

什麼樣的「巨大問題?」我也不確定'self'與'window'(或者什麼都沒有)是多麼兼容 –

+1

'newsCheck'是...? – gdoron

+0

@gdoron對不起是在急。信息全部在那裏 –

回答

1

我想這是你想要的東西:

//only run if on home page 
if (url == 'Home' || url == '' || url == 'home' || url == 'home.html' || url == 'Home.html'){ 

    //set up interval handler for cancellation when not on home 
    var handle= setInterval(function(){newsCheck()},1000); 

    // ... 

} 

編輯:既然你與HTML5歷史API周圍不斷變化的代碼,我認爲你需要的是這樣的:

// Set up the handle globally, because you won't have a history event triggered right away 
var handle = setInterval(function(){newsCheck()},1000); 
// Cancel it right away if you're not on the home page 
if (url != 'Home' && url != '' && url != 'home' && url != 'home.html' && url != 'Home.html') { 
    clearinterval(handle); 
} 

// Listen for history API events 
window.addEventListener('popstate', function(event) { 
    // Check the new url 
    if (url == 'Home' || url == '' || url == 'home' || url == 'home.html' || url == 'Home.html') { 
     // On the home page now, so set up the interval 
     // And we're inside an anonymous function now, so scope the handle to the window 
     window.handle = setInterval(function(){newsCheck()},1000); 
    } else { 
     // Not on the home page now, so clear the interval 
     // No guarantee that the interval exists at this point 
     if(window.handle) 
      clearinterval(window.handle); 
    } 
}); 

我認爲你需要爲'pushstate'事件監聽器做類似的事情,但是我對這件事情有些模糊,所以你只需要嘗試一下並看看。

原始響應

指針的夫婦。

  1. setInterval是現在大多數瀏覽器的javascript實現中的本地代碼。你不需要把它放在任何地方。請參閱MDN上的文檔和示例。
  2. 您不需要清除主頁以外的頁面上的時間間隔。主頁以外的頁面應該保持已設置。每秒一次新聞的Ajaxing非常瘋狂。一旦你解決了代碼,我強烈建議移動到更長的時間間隔。您的服務器和您的用戶電腦速度慢,延遲時間長或只是蹩腳的互聯網服務將感謝您。
  3. 根據你從哪裏得到url,它可能完全是假的。你是否證實它具有正確的價值?你確定你所比較的所有值都是可能的嗎?

此外,MDN具有這樣說,從間隔稱爲長時間運行的操作:

危險使用

如果有可能,你的邏輯可能需要更長的時間,而不是執行間隔時間,建議您使用window.setTimeout遞歸調用一個命名函數。例如,如果使用setInterval每5秒輪詢一次遠程服務器,網絡延遲,無響應的服務器以及其他一系列問題都可能阻止請求在其分配的時間內完成。因此,您可能會發現自己排隊等待XHR請求,而這些請求不一定會按順序返回。

對於這種情況,一個遞歸的setTimeout圖案是優選的:

(function loop(){ 
    setTimeout(function(){ 

     // logic here 

     // recurse 
     loop(); 

    }, 1000); 
})(); 

在上面的代碼中,一個叫函數環被聲明並立即執行。循環在邏輯完成執行後在setTimeout內部遞歸調用。雖然這種模式不能保證在固定的時間間隔內執行,但它確實保證了在遞歸之前先前的時間間隔已經完成。

我會建議設置從AJAX完成回調的下一個newsCheck()調用的超時。這樣它仍然是異步的,你不可能一次觸發多個請求。

+0

謝謝我會查看setTimeout。我知道1秒鐘是假的,我只用它,這樣我就不必等待很長時間才能登錄網絡日誌。但是,正如我所說的,如果不在Home中,我確實需要取消間隔,因爲我已經使用歷史API在新頁面中加載。請看看我添加到問題中的額外信息。 –

+0

@ nbs189有趣。什麼是歷史API?你有鏈接到一些文件,所以我可以檢查出來嗎? –

+0

基本上它在新的HTML5規範,並允許您更改內容,而無需啓動整頁加載。使用了jQuery和JavaScript的混合來實現這一點。我對我沒有鏈接,只是在其上運行Google搜索。我推薦來自HTML5岩石的文章。希望你覺得它很有趣 –