【问题标题】:preventing reloading of images when appending them with JQuery append()使用 JQuery append() 附加图像时防止重新加载图像
【发布时间】:2012-01-06 14:03:45
【问题描述】:

我有一个 AJAX 调用,它返回一些 JSON,包括一些图像 URL。我想为他们添加图像到 DOM,但我会一遍又一遍地获取相同的图像,我不想增加我的带宽成本。默认情况下,浏览器不会为我缓存这些图像 - 如果我使用 JQuery 创建一个 img 元素并附加它,浏览器会在我每次执行此操作时请求该图像。

所以我以隐藏 div 的形式添加了一个缓存,如下所示:

<div id="imageCache" style="display: none;"></div>

然后在循环遍历从服务器返回的可能有 imageKey 的 JSON 对象时在 JQuery 中执行此操作:

if (post.imageKey) {
    var cachedImage = $("#imageCache ." + post.imageKey);

    if (cachedImage.length) {
        var newImage = $(cachedImage).clone();
        $("#" + post.key).append(newImage);
    }
    else {                  
        var newImage = $("<img src='/image?key=" + post.imageKey + "' alt='" + post.title + "' class='offeredPost " + post.imageKey + "'/>");
        $("#" + post.key).append(newImage);

        cachedImage = $(newImage).clone();
        $("#imageCache").append(cachedImage);
    }
}

但没有快乐。克隆的图像被添加到 DOM 中,但是一旦 JS 完成页面,浏览器 (Chrome) 就会对图像发出新的请求。

有什么想法吗?谢谢。

【问题讨论】:

  • 浏览器可能没有缓存图像,因为您在 SRC 中使用了查询字符串。你可以为这些图片使用静态 URL 吗?
  • @mblase75 只有在查询字符串发生变化时才会出现这种情况。这就像在 url 末尾添加一个随机数以强制每次重新加载的旧技巧。它只起作用因为数字不同。
  • @Archer 谢谢,我确实记得——我只是没有足够的信息来确定 OP 的 post.imageKey 不会每次都在变化。以为我会把它扔在那里让他考虑。
  • 不,post.imageKey 每次都是一样的 - 它是图像的 ID。把它从查询字符串中拉出来没什么大不了的,但我认为 Archer 是对的。

标签: jquery image browser-cache


【解决方案1】:

使用宽度和高度设置为图片宽度和高度的div,并使用背景属性加载图片url('myImage.jpg')。使用 no-repeat 这样图片就不会重复,以防 div 比图片大

【讨论】:

  • +1 一个不错的技巧是也使用:background-position: center center; 以保持“背景”始终在其容器中居中。
  • 谢谢。这看起来会起作用,但它确实需要我在加载图像之前知道图像的暗淡,这有点棘手。考虑为此添加一些服务器端内容并将其传递到 AJAX 响应中。
  • 想不出任何简单的解决方案,但您可以在每次更改图像时动态设置 div 的尺寸。使用 ajax 调用来获取图像的尺寸(php GD 库有 getimagesize() 参见此处php.net/manual/en/function.getimagesize.php
  • 我的服务器端是 Google App Engine,因此获取图像的尺寸并非易事,但它是可能的。如果其他人需要此错误的详细信息:code.google.com/p/googleappengine/issues/…
猜你喜欢
  • 2012-04-09
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
相关资源
最近更新 更多