2011-08-22 161 views
1

所以我想做一個setInterval檢查頁面上的東西的位置。我遇到的問題是,如果我將它設置爲10,100,250,它似乎非常緩慢並且減慢了向下滾動。Javascript setInverval似乎很慢?

setInterval('functionName()', 10); 
setInterval('functionName()', 100); 
setInterval('functionName()', 250); 

UPDATE:的原因的功能是移動元素了網頁,當用戶滾動。問題在於它是一個比屏幕大的iFrame中的Facebook應用程序。我似乎無法找到一種方法來將ifScroll以外的onScroll屬性附加到Facebook上(或者也許你可以?!?我還沒有運氣),所以我不得不使用這種方法。基本上,它會抓住Facebook傳入的滾動高度並將元素向下移動。它的工作原理...但它似乎減緩甚至滾動下來。

這是我無法繞過的東西嗎?

+0

你確定你需要檢查連續的東西的位置,你不能在一個特定的事件嗎?你能舉一個你的代碼的例子嗎? –

+0

導致減速的功能是什麼?只是添加一個間隔不會導致頁面爬行。 – epascarello

+0

看我的更新!只是添加它並不會減慢速度,但將時間間隔設置得很好並不能帶來出色的用戶體驗。 –

回答

4

你每10ms做一件事。這很好,可能會影響瀏覽器的正常運行。無論何時運行javascript,瀏覽器界面都會被阻止。

也許如果你描述你想用間隔計時器來做什麼併發布你的代碼,我們可以建議更好的方法來做到這一點。

0

由於JavaScript的本質,它是單線程的。這意味着您的JavaScript以與瀏覽器的用戶界面相同的流程運行。因此,無論瀏覽器何時執行JavaScript,都必須停止它正在執行的操作(通常可能是在瀏覽器窗口中繪製頁面),然後運行代碼。

由於您正在運行一段代碼每秒100次(1000/10),您只是阻礙了您的瀏覽器的正常操作形式!

+0

僅僅因爲javascript是單線程的,並不一定意味着瀏覽器是單線程的,或者UI **必須凍結。瀏覽器不知道腳本在做什麼,所以當腳本重新配置DOM或導致UI更改時,它們會凍結UI。 – RobG

0

我的猜測是functionName()很慢。對於現代瀏覽器,250不應該太糟糕。發佈功能,我們會看看我們是否可以改進它。

2

setInterval()setTimeout()的最小時間分辨率因瀏覽器而異,在某些情況下可能高達15毫秒或20毫秒(某些文章狀態可達75毫秒)。您嘗試以更高的分辨率(更短的時間間隔)執行操作實際上更多地是對瀏覽器的請求 - 不能保證。請求分辨率高於瀏覽器能力的請求將被「夾住」,並且運行頻率不會低於最低限度。當然,如果瀏覽器的工作負載足夠高(因爲可能會得到一個連續調用函數的保證),那麼間隔可能會更長。

作爲一個方面說明,最好不要將您的函數參數作爲字符串提供給setInterval()。這樣做會導致該功能在全球範圍內評估。取而代之的是:

setInterval('functionName()', 10); 

你應該使用這樣的:

setInterval(functionName, 10); 

你應該重新考慮需要運行你的函數如此頻繁。也許有事件驅動的選擇。

參考文獻:你傳遞一個字符串setInterval當你真正應該傳遞函數對象本身:

setInterval(myFunction, 5000) 

當你放棄,會發生什麼還沒有被提到MDN on minimum delay

0

東西它像"functionName()"這樣的字符串就是它的eval'ed,這可能是的一些的來源緩慢。