【问题标题】:How can we synchronize image size and src when loading dynamically?动态加载时如何同步图片大小和src?
【发布时间】:2014-03-22 04:25:06
【问题描述】:

我有一个函数可以通过更改文档中 IMG 标记的 src 和 css(宽度/高度)来更新图像。下面是一个简化版本的说明:

changeImage = function(src,width,height) {
  $("#changethis").attr("src",src).css("width",width+"px").css("height",height+"px");
}

<img id="changethis" />

<input type="button" onClick="changeImage('image1.jpg',100,150);" />
<input type="button" onClick="changeImage('image2.jpg',185,200);" />
<input type="button" onClick="changeImage('image3.jpg',50,100);" />

问题在于,要么 src 要么 css 将首先更改,从而产生尴尬的拉伸效果,因为图像都是不同的大小。解决这个问题的最佳方法是什么?

请注意,在进行更改之前/之后,我已经尝试隐藏/重新显示 img。没运气。希望比我聪明的人能帮忙! :)

【问题讨论】:

  • 更新前有没有试过去掉宽高?
  • 首先你应该将 HTML 代码更改为 onClick="changeImage('image1.jpg',100,150);",因为配额不正确。
  • @jackJoe:没有。好主意。我会尝试并发布我的结果。谢谢。
  • @Evgeniy:这只是示例代码,但您当然是对的。示例代码已修复。谢谢。

标签: javascript jquery css image


【解决方案1】:

如果未缓存,则图像有加载时间。

解决办法,预加载图片:

changeImage = function(src,width,height) {
  var img = new Image();
  img.onload = function () {
     $("#changethis").attr("src",src).css("width",width+"px").css("height",height+"px");
  };
  img.src = src;
}

【讨论】:

  • 如果您最后设置 src,您可以确定它即使在缓存图像上也始终有效。正如你所拥有的,一旦图像被缓存,由于永远不会触发 onload 事件,该函数不会对某些浏览器中的其他调用执行任何操作。
  • 是的,通常它可以工作,因为它足够快,可以在从缓存加载之前附加处理程序。但也许在 JS 较慢的旧浏览器上它不会工作。
  • 这主要是老版本 IE 的问题,如果图像被缓存,它会在绑定之前立即同步运行 onload 事件。
  • 哦,好吧,很高兴你看到了!
  • @Fibbe:太棒了!我也会试试这个,今天发布我的结果。谢谢。
【解决方案2】:

如果您更改图像的src 属性,它将始终显示原始src,直到新图像完成加载。我建议您替换整个图像元素,而不是更改 src 属性。

changeImage = function(src, width, height) {
    $("#changethis").replaceWith(
        '<img id="changethis" src="' + src + '" width="' + width + '" height="' + height + '" />'
    );
};

【讨论】:

  • 这比我预期的要好。我已经尝试过类似的方法,在父 div 上使用 html(""),但它响应缓慢。 replaceWith("") 效果更好,而且非常简单。谢谢!
  • @Fibbe:感谢 Fibbe 的第一反应和预加载建议。我首先尝试了Fibbe的方法,它也很有效。我将接受 nderscore 的回答,但我可能也会实施某种预加载程序。谢谢你们!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多