这里最有可能发生的是您已经累积了对需要重新计算样式的 DOM 和/或样式表的更改。但是大多数渲染引擎(当然是 WebKit)会尽可能地推迟样式重新计算(以及布局和渲染)。在最好的情况下,一旦当前事件处理程序将控制权返回给本机代码,样式重新计算、布局和渲染都会按顺序运行。
但是有许多事情可以强制提前重新计算或布局。最常见的是您访问scrollTop
必须计算的 DOM 元素上的属性(例如, )。其他属性,例如offset[Left Top Width Height]
也通常强制重新计算和布局样式。浏览器无法“在后台”执行此操作,因为渲染引擎(在大多数情况下)与 Javascript VM 是单线程的,因此它通常必须等待您调用本机代码。
从您的屏幕截图中很难看出,但从我所见,您似乎在此事件之前解析了相当大的 HTML 块(价值 18 毫秒),这可能相当于大量的样式重新计算和布局(后者之后需要 26 毫秒)。我还在TableView._defRenderBodyFr()
您的堆栈跟踪中看到,这使我怀疑就在调用此 getter 之前,您已经添加/更改了相当数量的表行。代码很可能构建了一个大的TableView
HTML 字符串,但您只在设置时为 HTML 解析(和 DOM 构建)付费innerHTML
,但一旦代码尝试访问属性(在这种情况下scrollTop
),您就为样式重新计算和布局。
通过减少受每个突变影响的行数,您应该能够将这些成本分解成更小的块(从而使 UI 线程有机会呼吸,并且通常感觉更灵敏)。我不是 YUI 专家,所以我不能告诉你如何在他们的 TableView 中做到这一点。