2010-08-03 52 views
2

我正在研究一個名爲Smooth Div Scroll的jQuery插件(一個jQuery UI小部件),我需要在該頁面上存儲對特定於插件每個單獨實例的間隔的引用。如果我只是寫這樣的事情:在jQuery element.data對象中存儲JavaScript間隔?

 
var myInterval = setInterval(function() { 
    alert("Hi!"); 
}, 100); 

...變量myInterval實際上是window.myInterval,它會通過頁面上的插件的所有實例共享。所以當我嘗試設置或清除實例的時間間隔時,所有實例的時間間隔都將被設置/清除,因爲它們都引用相同的窗口變量。

通過瀏覽jQuery API,我發現方法.data用於存儲與匹配元素關聯的任意數據,因爲插件的每個實例都有相應的DOM元素。完善!使用這種方法,我可以存儲特定於匹配元素的數據。因此,我已構造我的這樣的代碼(其中EL是一個參考匹配元素):

 
el.data("myInterval", setInterval(function() { 
    alert("Hi!"); 
}, 100)); 

在一定程度上這工作由於插件的不同實例不再引用相同的變量(間隔)。但是我注意到如果我有一個帶有2-3個插件實例的頁面,並且我爲每個實例設置了相同的時間間隔,那麼只有第一個實例開始它的時間間隔。但是如果間隔計時器很小,則只有一些元素開始它們的間隔。

我沒有做過任何深挖中的實際值,但如果我有插件的三個實例在一個頁面上,間隔設置爲5,就像這樣:

 
el.data("myInterval", setInterval(function() { 
    alert("Hi!"); 
}, 5)); 

...只有第一例將開始。如果我將它增加到20-30,則其中兩個實例將啓動,如果我將它進一步增加到50,則所有三個實例都將啓動。這太奇怪了!

我的問題是:

是存儲到一個區間(使用。數據)一個好主意的參考? 如果是這樣,那麼失敗間隔的原因是什麼?

請幫我一個這個 - 我很難過! 如果您需要實際的源代碼,請查看插件頁面(本文頂部的鏈接)。

/托馬斯卡恩

+1

這是在'.each()'迭代中嗎? – 2010-08-03 18:15:42

+2

參考思路很好,儘管間隔對我來說似乎很小。你實際上需要每秒重複200次? – 2010-08-03 18:18:07

+0

我使用setInterval來平滑地滾動網頁上的元素,所以我需要一個快速的間隔來獲得一個平滑的動畫,但正如你所說,我懷疑滾動實際上得到200幀/秒的幀速率時,我設置間隔5. – tkahn 2010-08-04 09:20:15

回答

0

已經深入瞭解代碼並探究了一下,似乎問題與el.data中的區間存儲無關。間隔存儲得很好。我懷疑問題與代碼中執行順序錯誤的例程有關。正確的順序應該是:

  1. 使用jQuery的load()加載一大塊HTML內容 (圖片)。
  2. 計算這些元素的所有 的總寬度。
  3. 開始滾動這些圖像的時間間隔 。

問題似乎是,在使用jQuery加載通過AJAX加載內容的同時,會觸發計算所有元素的總寬度的例程。結果是計算出的加載元素的總寬度爲0(零),滾動例程停頓,因爲滾動寬度爲零的東西沒有意義。

1

的setInterval和setTimeout的的返回值只是在內部使用,以引用的超時,所以存儲與。數據的整數的整數的是不是一個問題。

+0

我需要將間隔存儲在代碼中任何位置都可訪問的變量中,以便在不再觸發時可以清除它。 – tkahn 2010-08-04 09:21:54