可以从“onload”处理程序调用canvas.drawWindow()吗?

时间:2010-07-07 21:40:01

标签: javascript events canvas firefox-addon onload

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
},

2 个答案:

答案 0 :(得分:2)

我希望这不是“根本不会”工作的情况,而是一个“无法正常”工作的情况。

传统上,onload在页面的html加载完成后运行。 CSS和脚本将在稍后发生,或者可能同时发生 1

这就是引入MozAfterPaint的原因。它允许您在Gecko有足够的信息呈现页面后注入代码。

通过侦听DOM突变事件,您可以解决缺少MozAfterPaint的问题。它不是那么干净,但我认为如果你用它来清除和重置100-200毫秒的tineout它会起作用。这不应该导致太多的性能损失。当超时终于到期时,您知道页面已经稳定了至少那么长时间。

[1]我花了一周时间追逐一个全局变量,该变量在执行onload处理程序时从未定义变为定义。事实证明,这是一个带有一些顶级代码的JS文件中的脚本标记,它使用onload处理程序在 parallel 中执行。

答案 1 :(得分:0)

看起来Mozilla文档是错误的,可以从“load”事件中调用canvas.drawWindow()。