javascript - 通过排队预加载图像?

标签 javascript jquery html css image

我正在寻找一种预加载特定图像并将其添加到队列中的方法。

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

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

换句话来说,image10 可能自然地位于预加载队列的末尾......但它可能是用户在开始时将鼠标悬停在的位置。因此 image10 应该被移至队列顶部并立即加载。完成后,队列应该从中断处继续加载。

谢谢!

编辑:我现在已经更新了代码,以便预加载工作......主要的“问题”是图像必须添加到 DOM 才能在 Mac 上的 Firefox 中触发 onLoad,我的具体需要是跟踪沿途的原始索引(以匹配标题等)

似乎有效..但奇怪的是,第二个元素的顺序很奇怪(在自动模式下,它在元素 #2 之前加载元素 #3)。

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

我还没有进行广泛的测试 - 但在 firebug 中,事情看起来有些正常:)

最佳答案

类似这样的东西(未经测试):

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 中。您需要按需添加它们。

关于javascript - 通过排队预加载图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6702735/

相关文章:

javascript - 如何阻止 Wordpress 页面跳转/滚动到 iframe?

关闭html标签后javascript读取html评论

javascript - 网站未加载。 jQuery 未定义

javascript - 如何将 html 列表添加到 Django 表单字段

javascript - 如何在 HTML 或 javascript 中绘制渐变背景?

javascript - selectize.js - 如何禁用所选项目后闪烁的光标?

javascript - FileReader JS Api 在准备就绪之前调用 Fire

javascript - 用一个导航标签控制多个标签内容

javascript - d3 排序仅适用于选择行

javascript - jQuery Mobile 对话框在 Chrome 中立即消失