drawImage from an array
drawImage from an array
我正试图从这样一个循环中的数组中绘制图像:
var frames = [];
for(var i=0;i<assets.length;i++){
frames[i] = new Image();
frames[i].onload = function() {
ctx.drawImage(frames[i],10,10);
};
frames[i].src = assets[i];
并得到错误:
值无法转换为以下任何一个:HTMLImageElement、HTMLCanvasElement、HTMLVideoElement
我似乎是将"frames[I]"传递给drawImage()的方式导致了这个问题。为什么会这样?正确的方法是什么?变量"i"在调用onload函数的上下文中无效吗?
感谢
您的问题是onload
回调是异步的,因此当调用回调函数时,循环可能已经结束,并且不再定义i
变量。无论如何,this
关键字指向回调中的图像:
var frames = [];
for (var i=0; i<assets.length; i++) {
frames[i] = new Image();
frames[i].onload = function() {
ctx.drawImage(this, 10, 10);
};
frames[i].src = assets[i];
}
你可能会遇到的下一个问题是,你无法控制图像在画布上的绘制顺序。请参阅此JsFiddle。
我会尝试以下代码:
var frames = [];
for (var i=0; i<assets.length; i++)
{
frames[i] = new Image();
frames[i].addEventListener(load, onImageLoaded, false);
frames[i].src = assets[i];
}
function onImageLoaded(e)
{
ctx.drawImage(this, 10, 10);
}
理由是您不需要维护变量i
,而且它使代码更易于阅读。由于onImageLoaded处理程序函数是以这种方式附加的,因此每次调用它时,this
变量都将包含与frames[i]
相等的值,其中i
包含适当的值。
相关文章:
- 如何为json对象中的段发送array[]
- Array.length似乎不起作用;console.log则显示其他情况
- 如何迭代Array.prototype函数
- Javascript 新的 Array 和 join() 方法
- Array.lenght = undefined
- Javascript setTimeout for an array
- Javascript - element.childNodes does not see an append.newch
- NodeJS API调用中Array中的Push和Pull元素
- 如何在MongoDB中将String转换为Array
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- 您的平台不支持RxJS-Array.observe
- Get JSON from an url
- Using this.selectedIndex inside an array in an 'onchange
- Passing an array to jade rendering
- jQuery grepping an array[]
- drawImage from an array
- Javascript Next, Prev, Random from an array
- Angular.isArray(data) returns false for an Array
- Javascript Reduce an empty array
- getElementById with an array Javascript