火狐浏览器的渲染顺序
Rendering order in Firefox
我正在用JavaScript构建图组件。它有两个单独渲染的图层:前景和背景。
要确定所需的背景大小:
- 渲染前景
- 测量结果的高度
- 渲染前景和背景一起
在代码中,它看起来像这样:
var foreground = renderForegroundIntoString();
parentDiv.innerHTML = foreground;
var height = parentDiv.children[0].clientHeight;
var background = renderBackgroundIntoString(height);
parentDiv.innerHTML = foreground + background;
使用IE7,这是小菜一碟。但是,Firefox2 并不愿意立即渲染parentDiv.innerHTML
,因此我无法读出前景高度。
Firefox 何时执行渲染,我怎样才能延迟背景生成直到前景渲染完成,或者是否有其他方法来确定前景元素的高度?
[在测试丹的答案后附加(感谢丹)]
在回调方法的主体中(由我可以看到的setTimeout(...))
回调),innerHTML
的呈现仍然不完整。
你永远不应该依赖你刚刚插入到 DOM 中的东西被下一行代码渲染。所有浏览器都会在某种程度上将这些更改组合在一起,并且很难确定何时以及为什么。
处理它的最佳方法是执行第二部分以响应某种事件。虽然在这种情况下看起来没有一个好的可以使用,所以如果做不到这一点,你可以通过以下方式触发第二部分:
setTimeout(renderBackground, 0)
这将确保当前线程在执行代码的第二部分之前完成。
我不认为你想要parentDiv.children[0](无论如何,孩子在FF3中不是一个有效的属性),而是你想要parentDiv.childNodes[0],但请注意,这包括可能没有高度的文本节点。您可以尝试循环等待 parentDiv 的后代呈现如下:
function getRenderedHeight(parentDiv) {if (parentDiv.childNodes) { 变量 i = 0; while (parentDiv.childNodes[i].nodeType == 3) { i++; } 现在 parentDiv.childNodes[i] 是你的第一个非文本子节点 返回 parentDiv.childNodes[i].clientHeight; 您的其他代码在这里...} else { setTimeout("isRendered("+parentDiv+")",200);}}
然后在设置 innerHTML 后调用:getRenderedHeight(parentDiv)。
无论如何,希望能给出一些想法。
相关文章:
- 如何在火狐浏览器中禁用F5和刷新
- 在火狐浏览器卸载之前
- 如何在火狐浏览器上增加 IndexedDB 的配额
- 多个 socket.io 客户端连接不起作用(谷歌浏览器,火狐浏览器)
- 火狐浏览器不会在前进时触发流行状态事件
- 在火狐浏览器的画布上获取鼠标位置
- d3.火狐浏览器中的鼠标像素偏移量
- 使用量角器打开火狐浏览器的文件网址
- 火狐浏览器 iframe 设计模式不起作用
- $injector:nomod模块“应用程序”不可用!仅限火狐浏览器
- 以编程方式打开火狐浏览器并执行 POST 请求?[想法:MozRepl,建议?
- 为什么我在火狐浏览器中剪辑的图像中有边框而不是铬
- 火狐浏览器与 event.target.id 的问题
- 帖子数据在火狐浏览器上不起作用
- 动态.js在火狐浏览器上很慢
- 关闭火狐浏览器的平滑滚动
- 为什么选择选项上的 .click() 只适用于火狐浏览器
- 窗口绑定在火狐浏览器中不起作用
- event.stopImmediatePropagation();适用于除火狐浏览器以外的所有浏览器
- 火狐浏览器的渲染顺序