2011-08-22 60 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,这可能是的一些的来源缓慢。