从javascript加载图像

IT技术 javascript jquery
2021-03-18 13:18:23

在我的专辑幻灯片页面上,我有类似的代码

<span style="display:none;">
   <img id="id1" src="~$imageUrl`" onload="javascript:showImage();">
</span>

<span>
    // show loader.
</span>

在 中showImage(),我确定图像已加载,因此我显示图像并隐藏加载器。

现在,当用户单击下一步时,我需要更改图像的 src。现在我不需要知道如何仅在加载图像时设置 src。

6个回答

您可以附加另一个隐藏img元素并在onload事件中交换它们

或者使用单个图像元素并使用 javascript,如:

var _img = document.getElementById('id1');
var newImg = new Image;
newImg.onload = function() {
    _img.src = this.src;
}
newImg.src = 'http://whatever';

此代码应预加载图像并在准备好时显示

@Yeti,JavaScript 用户代码是单线程的,但在 ajax 请求中有事件循环和内部异常。您描述的行为如何可能?stackoverflow.com/questions/4776670/...写到无需等待 onload 事件即可立即访问图像属性(这不是真正正确的编程方式)。它还写道,IE9b 在 img.src 设置后不会调用 onload,所以这是 IE9b 的问题,只是不生成事件,当它必须生成时。
2021-04-27 13:18:23
@Yeti:实际上不 - 那是不可能的。当脚本停止执行时,浏览器将开始下载。您可以通过各种不同的方式进行检查
2021-04-28 13:18:23
您应该先设置onload然后src,因为理论上图像可以在设置onload函数之前加载,因此似乎无法加载。
2021-04-30 13:18:23
@Adassko,看看这个问题:stackoverflow.com/questions/4776670/...我自己也遇到过这个问题,在特定浏览器版本的一些非常具体的情况下(我目前无法在 Firefox 上重现它) . 另外,设置onloadbefore也没有坏处src
2021-05-14 13:18:23
@Yeti:我从未见过这种行为,但我同意 - 这样做没有害处。已编辑
2021-05-15 13:18:23

对不起大家。

您不能依赖图像加载事件来触发,但您可以在某些情况下依赖它并回退到允许的最大加载时间。在这种情况下,10 秒。我写了这个,它存在于生产代码中,当人们想要链接表单帖子上的图像时。

function loadImg(options, callback) {
  var seconds = 0,
  maxSeconds = 10,
  complete = false,
  done = false;

  if (options.maxSeconds) {
    maxSeconds = options.maxSeconds;
  }

  function tryImage() {
    if (done) { return; }
    if (seconds >= maxSeconds) {
      callback({ err: 'timeout' });
      done = true;
      return;
    }
    if (complete && img.complete) {
      if (img.width && img.height) {
        callback({ img: img });
        done = true;
        return;
      }
      callback({ err: '404' });
      done = true;
      return;
    } else if (img.complete) {
      complete = true;
    }
    seconds++;
    callback.tryImage = setTimeout(tryImage, 1000);
  }
  var img = new Image();
  img.onload = tryImage();
  img.src = options.src;
  tryImage();
}

像这样使用:

loadImage({ src : 'http://somewebsite.com/image.png', maxSeconds : 10 }, function(status) {
  if(status.err) {
    // handle error
    return;
  }
  // you got the img within status.img
}); 

在 JSFiddle.net 上试试

http://jsfiddle.net/2Cgyg/6/

“你不能依赖图像加载事件来触发”为什么??
2021-04-26 13:18:23
@santamanno thx,我会尝试花一些时间来调查此行为,如果我无法重现,我将删除,因为此时它可能不正确。最好按照您的建议在网络级别处理。
2021-04-29 13:18:23
这也用“img”变量污染了全局范围,也许您应该使用 const 和局部变量进行重构?另外,为什么我们不能使用 onload 事件?
2021-05-03 13:18:23
为什么不简单地使用 jQuery?它使事情变得更加简单:stackoverflow.com/a/63003728/1243247
2021-05-08 13:18:23
当加载事件不会在 304 上触发时,Chrome 中的缓存存在一些不一致的情况
2021-05-15 13:18:23
<span>
    <img id="my_image" src="#" />
</span>

<span class="spanloader">

    <span>set Loading Image Image</span>


</span>

<input type="button" id="btnnext" value="Next" />


<script type="text/javascript">

    $('#btnnext').click(function () {
        $(".spanloader").hide();
        $("#my_image").attr("src", "1.jpg");
    });

</script>

如果您通过 AJAX 加载图像,您可以使用回调来检查图像是否已加载并进行隐藏和 src 属性分配。像这样的东西:

$.ajax({ 
  url: [image source],
  success: function() {
  // Do the hiding here and the attribute setting
  }
});

有关更多阅读,请参阅此JQuery AJAX

每次要加载图片时使用一个新的图像对象:

var image = new Image();
image.onload = function () {
    document.getElementById('id1').setAttribute('src', this.src);
};
image.src = 'http://path/to/image';