this Mozilla wiki page底部的注释当前说:“在处理文档的onload事件时使用canvas.drawWindow()不起作用。在Firefox 3.5或更高版本中,您可以在处理程序中执行此操作MozAfterPaint事件在页面加载时成功将HTML内容绘制到画布中。“这很好,除了我在Firefox 3.6.6中尝试过它做了工作,让我相信它可能因为一些已修复的错误而无法工作。我宁愿不使用MozAfterPaint,因为它不适用于3.5之前的版本。 不使用“加载”事件有一个重要原因,如果是这样,我该怎样做才能与旧版本的Firefox兼容?
编辑:这是我的代码的工作方式。在我的附加信息的init()
功能中,我致电gBrowser.addEventListener("load", MyExtension.onPageLoad, true);
然后MyExtension.onPageLoad
基本上是:
onPageLoad : function(e) {
var win = e.originalTarget.defaultView;
// create an html:canvas, adjust its size, etc. following the example of the "TabPreview" extension
var ctx = canvas.getContext("2d");
ctx.drawWindow(win, 0, 0, w, h, "rgb(255, 255, 255");
// add the canvas to the DOM
},
答案 0 :(得分:2)
我希望这不是“根本不会”工作的情况,而是一个“无法正常”工作的情况。
传统上,onload
在页面的html加载完成后运行。 CSS和脚本将在稍后发生,或者可能同时发生 1 。
这就是引入MozAfterPaint
的原因。它允许您在Gecko有足够的信息呈现页面后注入代码。
通过侦听DOM突变事件,您可以解决缺少MozAfterPaint
的问题。它不是那么干净,但我认为如果你用它来清除和重置100-200毫秒的tineout它会起作用。这不应该导致太多的性能损失。当超时终于到期时,您知道页面已经稳定了至少那么长时间。
[1]我花了一周时间追逐一个全局变量,该变量在执行onload处理程序时从未定义变为定义。事实证明,这是一个带有一些顶级代码的JS文件中的脚本标记,它使用onload处理程序在 parallel 中执行。
答案 1 :(得分:0)
看起来Mozilla文档是错误的,可以从“load”事件中调用canvas.drawWindow()。