РЕДАКТИРОВАТЬ : Я только что нашел что-то, что работает при каждой загрузке страницы, кроме первой (жесткой) загрузки. Это «странный совет, чтобы заставить его работать», потому что он не использует onload. Э.Г.
Это работает при нагрузках 2 ... n:
case String:
var img = new Image();
img.onload = function() {
//context.drawImage(img,0,0);
};
img.src = detail;
context.drawImage(img,0,0);
Это не работает при любой нагрузке 1 ... n:
case String:
var img = new Image();
img.onload = function() {
context.drawImage(img,0,0);
};
img.src = detail;
//context.drawImage(img,0,0);
Я не очень рад, что пропускаю самую важную нагрузку (первую), но, по крайней мере, есть некоторый прогресс.
Может ли кто-нибудь помочь мне объяснить, что здесь происходит? Я действительно сбит с толку. Я хочу, чтобы изображение загружалось и каждый раз рисовалось на холсте. Это нереальное ожидание?
Я использую FF 7.0.1 в Ubuntu, мой пользовательский агент: Mozilla / 5.0 (X11; Linux i686; rv: 7.0.1) Gecko / 20100101 Firefox / 7.0.1
РЕДАКТИРОВАТЬ : По-прежнему не удается выполнить все попытки, использованные в комментариях. Я буду продолжать думать об этом. Я думаю, что это как-то связано с тем, что холст больше не доступен (хотя переменная разрешается правильно и в JS Debugger в FF не выдается ошибка).
Я пишу js-фреймворк для рендеринга на canvas, чтобы обеспечить простой API для написания GUI с меньшим количеством кода и более красивого кода, чем при использовании Canvas API. Это просто обертка вокруг холста. Но я не эксперт по JS, хотя я все равно люблю JS.
Следующий код в замыкании может выполнять и получать доступ к области действия переменной img, может вызывать форму оповещения о том, что область действия при загрузке изображения, может изменять свойства стиля img css, но не будет выполнять drawImage в контексте canvas в контекстная переменная.
До закрытия context.fillRect будет работать нормально, но внутри замыкания - нет. Я думаю, что есть кое-что фундаментальное, что я еще не изучил, так как раньше я кодировал подобную нагрузку с помощью кода с закрытием, и все просто работало. Надеюсь, сегодня день, когда я узнаю что-то новое.
RenderProvider.prototype.drawImage = function(srcElement,context,state,detail) {
if(detail == undefined || detail == null) {
alert("Image is not present. Ignoring.");
return;
}
switch(detail.constructor) {
case String:
alert("Image is from String");
var img = new Image();
img.src = detail;//'t.jpg';//'Star-Field.gif';//http://www.google.com/favicon.ico';
img.onload = function (e) {
alert('Drawing ' + img + ' to ' + context);
alert('Context dim ' + context.canvas.width + ',' + context.canvas.height );
context.drawImage(img,20,20);
return true;
};
img.src = detail;//'t.jpg';//'Star-Field.gif';//'http://www.google.com/favicon.ico';
break;