通过排队预加载图像?

时间:2011-07-15 04:37:25

标签: javascript jquery html css image

我正在寻找的是一种在队列中预加载和碰撞特定图像的方法。

这是我到目前为止所处的位置:http://shivimpanim.org/testsite/imageloader.html

你可以看到它有图像预加载,但据我所知,没有队列管理(或者如果新写入DOM,浏览器会智能地提升队列中请求的图像吗?)

换句话说,可能是自然image10朝向预加载队列的末尾......但它可能是用户在开头右侧盘旋的地方。所以image10应该碰到队列的顶部并立即加载。完成后,队列应该从中断处继续加载。

谢谢!

编辑:我现在已经更新了代码,以便预加载工作...主要的“陷阱”是必须将图像添加到DOM中以便onLoad在Mac上的firefox中触发,我需要跟踪路线上的原始索引(以匹配标题等)

似乎工作..但奇怪的是,第二项的顺序很奇怪(它在自动模式下的项目#2之前加载项目#3)。

但总而言之 - 它一次以正确的顺序自动加载2个项目,当用户将鼠标悬停在链接上时,它会将该项目碰到队列中,然后在加载时显示:)

我没有进行过广泛的测试 - 但是在萤火虫中看起来有些正常:)

1 个答案:

答案 0 :(得分:4)

像这样(未经测试):

function loader( images, n_parallel ){
    this.queue   = images.slice( 0 );
    this.loading = [];

    for( var i=0; i<n_parallel; i++ ) this.dequeue();
}

loader.prototype.dequeue = function(){
    if( !this.loading.length ){ return; }

    var img = new Image(),
       self = this;
    img.src = this.queue.unshift();

    if(img.width){
        self.dequeue();
    }else{
        img.onload = function(){
            self.dequeue();
        }
    }
}

loader.prototype.promote = function( src ){
    for(var i=0, l=this.queue.length; i<l; i++){
        if(this.queue[i] == src){
            this.queue.unshift( this.queue.splice(i, 1)[0] );
            break;
        }
    }
}


var imgs = new loader( ['foo.jpg', 'bar.jpg', 'foobar.jpg', ...], 2 );
...
imgs.promote( 'some_img.jpg' );

为了使其正常工作,您还无法在页面加载时将所有图像添加到dom中。您需要按需添加它们。