【问题标题】:Preloading dynamically loaded images with jquery使用 jquery 预加载动态加载的图像
【发布时间】:2012-07-25 14:06:13
【问题描述】:

这些图片是动态加载的:

<div id="gallery-images" class="gallery-control">
    <ul>
        <img class="galleryImgs" data-src="images/test-image-1.jpg" src="images/test-image-1-s.jpg" />
        <img class="galleryImgs" data-src="images/test-image-2.jpg" src="images/test-image-2-s.jpg" />
        <img class="galleryImgs" data-src="images/test-image-3.jpg" src="images/test-image-3-s.jpg" />      
    </ul>
</div>

我正在尝试从每个 img 标签的“data-src”属性中预加载图像 URL。这是我写的代码:

$('.galleryImgs').each(function(){
    $('<img/>')[0].src = $(this).attr("data-src");
});

目前无法运行动态脚本,因此图像标签当前是静态的。这段代码看起来应该可以工作还是我遗漏了什么?

【问题讨论】:

  • 检查它是否触发了对控制台上这些图像的任何 GET 请求。如果没有,您可以尝试将其附加到 display:none 容器内的 DOM。
  • 我会像这样使用每个函数: $('.galleryImgs').each(function(idx, e) { ... }
  • 那不行吗?代码看起来不错。我不知道您是遇到实际问题还是只是询问它看起来是否正常。
  • 实际上无法判断它是否正常工作,因为正如我所说,现在一切都是静态的,但是在清除缓存后,性能转换似乎有所改善,但显然我不能完全确定,直到我运行实际的动态脚本。如果有的话,我将使用@FabrícioMatté 提供的建议并查看更新的 ajax 源以确保其正常工作。
  • 哦,这只是一个快速的想法,无论如何,使用$.get 预缓存每个图像也应该在现代浏览器中工作。我可能会做一个小提琴来测试。

标签: jquery preload


【解决方案1】:

我用我最初评论的想法做了一个快速的 sn-p,它应该可以跨域工作:

$(function() {
    //creates an imgcacher hidden element
    $('<div/>', {id: 'imgcacher', style: 'display:none;'}).appendTo('body');
    var cacher = $('#imgcacher'); //caches the cacher selector

    //appends the images to the DOM for caching
    $('.galleryImgs').each(function(){
        $('<img/>', {src: $(this).data('src'), class: "precachedImg"}).appendTo(cacher);
    });

    //clean up the DOM after the images are fully loaded and cached
    $('.precachedImg').promise().done(function() {
        cacher.remove();
    });
});​

DEMO
请注意,如果您的连接速度不够快,第二张图片可能会稍大,无法在 5 秒内加载,但它应该至少部分加载。

$.get 在我测试时无法在 Chrome 上缓存图像,因此上述解决方案是我的首选。它适用于我以任何连接速度和文件大小测试过的所有浏览器。现代浏览器只会请求一次图像资源,并与页面中的所有其他重复项并行显示,而不会像 ajax 请求那样生成额外的请求。

此外,它还是一个动态、可扩展且简洁的解决方案。但是,如果您更喜欢简单,它具有“相同”的最终用户体验,而不是最初将带有 display:none 的图像添加到 DOM。显然这会不必要地弄乱 DOM,因此我会选择上面的 sn-p。

另外,这里有一个稍微简化的版本:

$(function() {
    //appends the images to the DOM for caching
    $('.galleryImgs').each(function(){
        $('<img/>', {src: $(this).data('src'), class: 'precachedImg', style: 'display:none;'}).appendTo('body');
    });

    //clean up the DOM as the images are loaded and cached
    $('.precachedImg').load(function() {
        $(this).remove();
    });
});

Fiddle

【讨论】:

  • 没问题。 =] 我也做了一个稍微简化的版本,如果您在第一个代码中遇到问题(但在任何现代浏览器中都不应该发生),它可以确保在从 DOM 中删除元素之前完全加载图像,或者,如果您发现任何浏览器有问题,您也可以删除清理块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 2017-09-30
  • 2011-08-25
  • 1970-01-01
相关资源
最近更新 更多