我的代码中遇到了事件监听器和图像加载器的问题。当我尝试加载并检查基于事件监听器的加载图像的状态时,跳过了一些图像。我认为浏览器只能处理一个事件,而当活动的一个没有停止时,下一个可以工作并跳过它的工作。因此很少有图像返回wront状态并且可以使用。请给我一些关于此的建议。这是我的代码:
//Image loader
var urlList = [
'images/ground_02.png', // 0 - FG
'images/ground_layer0.png', // 1 - CITY
...
];
var urlListLength = urlList.length; //length of URL-array
var iCount = new Number(0); // Create zero-counter
var images = new Array(); // All images array. Each elem stores one image
var imageInfo = function(imageName, imageCount, imageWidth, imageHeight) { // Constructor for image data container
this.imageName = imageName; // Url of image
this.imageCount = imageCount; // Frames
this.imageWidth = imageWidth; // Width of images
this.imageHeight = imageHeight; // Height of images
};
var imageData = new Array(); // Images data array
for (var i=0; i!=urlListLength; ++i) { // Loop for each image load
images[i] = new Image(); // Image array.
images[i].addEventListener('load', function(i) {
imageData.push(new imageInfo(images[iCount], images[iCount].width/images[iCount].height, images[iCount].width, images[iCount].height));
iCount++;
if (iCount == urlListLength) {
var loaded = true;
loop();
};
}, false);
images[i].src = urlList[i];
images[i].onerror=function() {
alert("FAIL "+this.src);
};
};
答案 0 :(得分:0)
这适用于所有浏览器,包括IE6。
var list = [
'images/ground_02.png',
'images/ground_layer0.png'
],
images = {};
function loadImage() {
images[this.src] = {
loaded: (this.width > 0 ? true : false),
src: this.src,
width: this.width,
height: this.height
};
if (list.length < 1) return;
var url = list.pop(),
img = new Image();
img.onload = loadImage;
img.onerror = loadImage;
img.src = url;
}
loadImage(); // Initialize loading
如果您需要检查图片是否已加载:
function isImageLoaded(src) {
return (images[src] && images[src].loaded);
}
if (isImageLoaded('images/ground_02.png')) alert('Yes!');
答案 1 :(得分:0)
至少你有问题:
imageData.push(new imageInfo(images[iCount], images[iCount].width/images[iCount].height, images[iCount].width, images[iCount].height));
浏览器加载图像后会触发 load
事件。但是没有必要以与启动加载相同的顺序触发它。基本上,images[2]
可以在images[0]
和images[1]
之前加载,在这种情况下,iCount将无效。
您可以使用this
代替images[iCount]
,因为在这种情况下this
将指向已触发加载事件的图像。
imageData.push(new imageInfo(this, this.width/this.height, this.width, this.height));
我认为浏览器只能处理一个事件,而有效事件则不能处理 停下来可以工作并跳过它的工作。
不。那是错的。通常会触发所有事件。但是JS是单线程的,所以它只是将一个事件放入一个队列中,并在之前的事件完成后运行下一个事件。它不会跳过任何事件。