【问题标题】:Is there a way to load images to user's cache asynchronously?有没有办法将图像异步加载到用户的缓存中?
【发布时间】:2011-12-09 18:33:45
【问题描述】:

我有一个物品清单。它们每个都是一个有名字的正方形,当用户将鼠标悬停在正方形上时,会显示一个图像,这是由 jQuery 完成的。代码是这样的:

$('.square').hover(function() {
  var link = $(this).attr('title');
  $(this).addClass('squarehover')
         .css({backgroundImage: 'url(images/' + escape(link) + '.jpg)'}); 
}, function() {
  $(this).removeClass('squarehover')
         .attr('style', '');   
});

.squarehover {
  font-size: 0px;
  background-repeat: no-repeat;
  background-size: 100%;
  -moz-background-size: 100%;
  background-position: center center;
  position: absolute;
  z-index: 10;
  cursor: pointer;
}

如果没有预先加载图片,悬停时会有一点延迟。另外,我不想在加载完所有图像后显示页面。

由于页面中没有明确显示图像,是否可以先加载页面然后开始将图像加载到用户的缓存中(我的想法是用户不会立即将鼠标移动到那些方块上)?如果 HTML 中没有 <img> 标签怎么办?

顺便说一句,由于IE8不支持background-size,如何处理?

【问题讨论】:

    标签: javascript html image


    【解决方案1】:

    您可以像这样预加载图像:

    function preloadImages(srcs) {
        if (!preloadImages.cache) {
            preloadImages.cache = [];
        }
        var img;
        for (var i = 0; i < srcs.length; i++) {
            img = new Image();
            img.src = srcs[i];
            preloadImages.cache.push(img);
        }
    }
    
    // then to call it, you would use this
    var imageSrcs = ["src1", "src2", "src3", "src4"];
    
    preloadImages(imageSrcs);
    

    只需在 imageSrcs 数组中填写 URL,然后在您的页面首次运行时运行它。您越早运行它,您的图像就越早可用。

    仅供参考,这里有一个相关答案:Image preloader javascript that supports events

    【讨论】:

    • 不应该是img.src = srcs[i]
    • 如果你不把图片放到页面中,它们稍后会被浏览器缓存(至少在 chrome 中),所以你应该把它们放在 HTML 中,也许用 display:none
    • @melanke - 图片不需要在页面中。一旦它们在这里加载,它们将被缓存在浏览器缓存中,就像 DOM 中的任何图像一样。一旦进入缓存,它们将很快加载(无需网络即可获取图像数据)。它们不会永远留在缓存中,但在大多数配置中,它们至少会在缓存中保存几天的浏览时间。
    • 我有这个问题:如果我在移动设备上,使用 chrome,只在 JS 中加载图像,不要将它们放在 html 中,稍等片刻,然后将它们放在 HTML 中,他们将不得不再次加载
    • @melanke - 您是否像上面的代码一样保存 JS 图像对象?这些对象就像在 DOM 中一样活跃,所以应该没有区别。如果您让垃圾收集器处理 JS 创建的 img 对象,那么内存不足的浏览器可能会以不同的方式处理它们,但我不这么认为,当图像仍然存在时。
    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多