2010-03-23 88 views
2

比方說,我這樣做:使用Javascript - jQuery的.load()和setInterval()問題

$("#content").load(...); 

內包含的內容我加載一些javascript:

var myCounter = 0; 
var myInterval = setInterval(function(){ 
    myCounter++; 

    $("#counter-display").html("Count: "+myCounter); 
}); 

,原因未知,如果我用$(「#content」)重新加載內容load(...); - myInterval現在被調用兩次。

我試圖做這樣的事情:

if (myInterval !== undefined){ 
    //dont set interval again 
} 

但是,這是行不通的。有沒有人知道任何方法,以便myInterval在.load上清除,而不需要將JavaScript放在加載文件之外?

回答

2

建議保持區間與反向件上的數據對象數,像這樣:

var disp = $("#counter-display"); 
if(!disp.data("interval")) { 
    disp.data("interval", setInterval(function() { 
    var count = (disp.data("count") || 0) + 1; 
    disp.data("count", count).html("Count: " + count); 
    }, 500)); 
} 

更多的代碼一次,但對於全局變量更清潔等

+0

我想到最初這樣做,但我想嘗試一種方法,而不需要每次都從html獲取值。但是,這確實最好,所以我會使用它。謝謝! – Joe 2010-03-23 01:49:23

+0

經過進一步測試,儘管此方法用於更新顯示的計數,但在腳本中嘗試使用該計數時,它仍然會增加一倍。我找不到任何解決方案,除了將腳本放在加載內容的外部(例如,在我執行.load()的頁面上)。 – Joe 2010-03-23 02:19:14

+0

@Joe:您可能正在重新創建'@ counter-display'元素。將數據放入一個不被替換的元素中。 – SLaks 2010-03-23 02:28:07

0

您的代碼正在執行兩次。

嘗試在聲明變量前檢查if (typeof myInterval !== "undefined")

+0

測試 - 不工作。似乎每個「myInterval」實際上在DOM中分開處理。 – Joe 2010-03-23 01:46:46

+0

你的代碼是在一個函數中嗎? – SLaks 2010-03-23 01:47:30

+0

是的。無論哪種方式,尼克Craver的解決方案工作正常。 – Joe 2010-03-23 01:50:41

0

你」您可能會發現myInterval正在某些本地範圍內定義。

嘗試使用:

var myCounter = 0; 
myInterval = setInterval(function(){ 
    myCounter++; 

    $("#counter-display").html("Count: "+myCounter); 
}); 

myInterval現在在全球範圍內被宣佈。

您當然可以使用clearInterval,並做clearInterval(myInterval)這也將確保只有在間隔正在使用的情況下。

+0

如果你加載這段代碼兩次,它不算作全局,所以這是行不通的。 clearInterval只會清除已加載的myInterval,但不會清除第二個加載的myInterval。令人困惑...... – Joe 2010-03-23 01:59:05

+0

除非使用var語句,否則變量被聲明爲全局變量。 'myInterval = ....'使myInterval成爲全局;幾乎相當於'window.myInterval = ...' – Matt 2010-03-23 13:25:56