Javascript图片预加载
在遇到图片很多的时候,使用图片预加载可以避免在交互展示中所造成的一些麻烦,比如图片背景切换闪烁问题。
简单版本:
var preloadImages = [];
function preload() {
for (i = 0; i < preload.arguments.length; i++) {
preloadImages[i] = new Image();
preloadImages[i].src = preload.arguments[i];
}
}
调用例子:
preload(
window.basepath +"/answer_bg1_1.png",
window.basepath +"/answer_bg2_1.png"
);
复杂版本:
var imgReady = (function () {
var list = [], intervalId = null,
tick = function () {
var i = 0;
for (; i < list.length; i++) {
list[i].end ? list.splice(i--, 1) : list[i]();
};
!list.length && stop();
},
stop = function () {
clearInterval(intervalId);
intervalId = null;
};
return function (url, ready, load, error) {
var onready, width, height, newWidth, newHeight,
img = new Image();
img.src = url;
if (img.complete) {
ready.call(img);
load && load.call(img);
return;
};
width = img.width;
height = img.height;
img.onerror = function () {
error && error.call(img);
onready.end = true;
img = img.onload = img.onerror = null;
};
onready = function () {
newWidth = img.width;
newHeight = img.height;
if (newWidth !== width || newHeight !== height ||
newWidth * newHeight > 1024
) {
ready.call(img);
onready.end = true;
};
};
onready();
img.onload = function () {
!onready.end && onready();
load && load.call(img);
img = img.onload = img.onerror = null;
};
if (!onready.end) {
list.push(onready);
if (intervalId === null) intervalId = setInterval(tick, 40);
};
};
})();
调用例子:
imgReady(window.basepath +"/answer_bg1_1.png", function () {
alert('size ready: width=' + this.width + '; height=' + this.height);
});