Можно ли вызывать canvas.drawWindow () из обработчика onload? - PullRequest
3 голосов
/ 08 июля 2010

В примечании внизу этой вики-страницы Mozilla в настоящее время написано: «Использование canvas.drawWindow () при обработке события onload документа не работает. В Firefox 3.5 или более поздней версии вы можете сделать этов обработчике для события MozAfterPaint , чтобы успешно рисовать HTML-контент на холсте при загрузке страницы. "Это нормально, за исключением того, что я попробовал это в Firefox 3.6.6, и он сделал , что заставило меня поверить, что, возможно, раньше это не работало из-за некоторой ошибки, которая с тех пор была исправлена.Я бы предпочел не использовать MozAfterPaint, поскольку он не будет работать в версиях, предшествующих 3.5.Есть ли важная причина , а не , чтобы использовать событие «load», и если да, что я могу сделать вместо этого, это будет совместимо с более старыми версиями 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 ]

2 голосов
/ 08 сентября 2010

Полагаю, дело не в том, что оно не будет работать "совсем", а в том, что оно не будет работать "правильно".

Традиционно onload запускалось, когда HTML-страница загружалась. CSS и сценарии произойдут позже или, возможно, одновременно 1 .

Вот почему был введен MozAfterPaint. Он позволяет вводить код после того, как Gecko имеет достаточно информации для отображения страницы.

Возможно, вы сможете обойти отсутствие 1013 *, прослушивая события мутации DOM. Это не так чисто, но я думаю, что это будет работать, если вы используете его для очистки и сброса 100-200 мс времени ожидания. Это не должно вызвать слишком большой удар по производительности. Когда тайм-аут наконец истекает, вы знаете, что страница была стабильной, по крайней мере, так долго.

[1] Я потратил неделю на поиски глобальной переменной, которая во время выполнения обработчика загрузки перешла от неопределенной к определенной. Он оказался тегом script, извлеченным из файла JS, содержащего некоторый код верхнего уровня, и выполнялся в параллельно с обработчиком загрузки.

0 голосов
/ 07 сентября 2010

Похоже, что документация Mozilla неверна, и можно вызывать canvas.drawWindow () из события load.

...