- 主题:我遇到了一个神奇的 IE Bug...
我写的一个复杂的页面渲染引擎,在构造出大量 div 之后,只要 click 鼠标之后,系统就会停顿很久(我用的 setTimeout),间隔会超过 500ms。但是我用 IE dev tool 的 profiler 分析了几十秒,我得脚本总耗时不超过 128ms(唯一入口是这个 update...)
完全不可理喻啊,难道是由于 click 事件在这些 div 之间 bubbling ?怎么都像 IE8 的 bug 啊。
我完全没有捕捉任何鼠标事件 -_-b
_SM_cn_monadic_phantom_sample_Test_update 114 128.00 4.00
_SM_cn_monadic_phantom_render_Visualization_evolve 114 124.00 116.00
_SM_cn_monadic_phantom_master_AxisScenario_update 114 124.00 .00
> COST = 883,0 : /COST = 60,0 :
> COST = 891,0 : /COST = 62,0 :
> COST = 4202,0 : /COST = 63,0 :
> COST = 869,0 : /COST = 62,0 :
> COST = 815,0 : /COST = 63,0 :
> COST = 705,0 : /COST = 62,0 :
> COST = 1082,0 : /COST = 63,0 :
> COST = 491,0 : /COST = 63,0 :
--
FROM 125.34.222.*
典型的代码
function foo()
{
update();
setTimeout("foo()", 50);
}
update() 里面有很复杂的逻辑,但是在我这个例子里面,其实什么也没干(没有改变任何 dom)
click 是在那堆 div 上面(很复杂的 dom 结构,一大堆 div + img absolute 布局)
另外,点的即便不在那堆 div 上面也会烂掉。 orz
如果连续点击甚至可以出 3000ms 这种延迟
【 在 sayinger (言者) 的大作中提到: 】
: 没看太明白,停顿跟用setTimeout是怎么个关系,还有这个update是怎么做的,拼html还是dom操作,click鼠标是在任意位置,还是在渲染出来的div上?
--
修改:nullgate FROM 125.34.222.*
FROM 125.34.222.*
我发现连续点击那个区域可以导致 CPU 负荷达到 100% (因为是双核,所以只是其中一个,我实在是膜拜 IE8 了)。莫非 IE8 处理 click 事件需要遍历整个 dom tree?就连我用 javascript 写的鼠标事件处理器效率都没有这么低啊。
我放弃了,我去睡觉了。
【 在 sayinger (言者) 的大作中提到: 】
: 没看太明白,停顿跟用setTimeout是怎么个关系,还有这个update是怎么做的,拼html还是dom操作,click鼠标是在任意位置,还是在渲染出来的div上?
--
FROM 125.34.222.*
50ms 才 20fps 呢。没有这个事件我咋测量这个延迟呢?我也不理解啊,这个 dom 是很复杂,一个 div 画布上有上千个 absolute 定位的 div/img。等我有空了整理一个版本出来演示一下吧
【 在 sayinger (言者) 的大作中提到: 】
: 如果没有这句,click就不会引发延迟么?话说回来50ms的间隔对于update()是不是短了点,如果里面有大量计算的话,调大点试试呢。至于click事件,应该是会从叶子走到根,再从根走回叶子的,dom太复杂开销会大些,不过也不应该这么严重。
--
FROM 131.107.0.*
似乎没有 gif 啊,全都是 png
【 在 giogio (紫色隐者·敕封 74式) 的大作中提到: 】
: 据说IE8有个gif相关的bug?
--
FROM 114.240.51.*
我换过 interval 也没用,呵呵。
问题就在于 Mouse Click (没有注册任何 onclick...,用 profiler 也能看到这一点) 把资源抢占了。
【 在 xudoz (海豚图腾) 的大作中提到: 】
: 没遇到过,给个demo看看?这个文章说的可能对你有帮助,没看过可以看看。
: How JavaScript Timers Work
:
http://ejohn.org/blog/how-javascript-timers-work/: ...................
--
FROM 131.107.0.*
囧死... 我被逼到使用 ProcessExplorer 看 IE 的 stack,赫然发现 FlashGet BHO,这玩意儿太流氓了,大概是拦截了 click 事件,然后无耻地做 dom walk,但是写得太垃圾,连 hidden element 都要 walk,艹
这才是真正的流氓软件啊
【 在 nullgate (空门·恨只恨我们家鬼害家神) 的大作中提到: 】
: 我写的一个复杂的页面渲染引擎,在构造出大量 div 之后,只要 click 鼠标之后,系统就会停顿很久(我用的 setTimeout),间隔会超过 500ms。但是我用 IE dev tool 的 profiler 分析了几十秒,我得脚本总耗时不超过 128ms(唯一入口是这个 update...)
: 完全不可理喻啊,难道是由于 click 事件在这些 div 之间 bubbling ?怎么都像 IE8 的 bug 啊。
: 我完全没有捕捉任何鼠标事件 -_-b
: ...................
--
FROM 221.219.181.*
没装过...
【 在 firefox3 (DUO 麻痹) 的大作中提到: 】
: xunlei不干这事?
--
FROM 221.219.181.*
浪费我好多时间 -_-b 不过修了两个无关痛痒的 bug
【 在 kabbesy (Arthas) 的大作中提到: 】
: 赞,终于找到了,哈哈
--
FROM 221.219.181.*