如何使用 Javascript/jQuery 确定图像是否已加载?

IT技术 javascript jquery image
2021-01-28 18:39:48

我正在编写一些 Javascript 来调整大图像的大小以适应用户的浏览器窗口。(不幸的是,我不控制源图像的大小。)

所以像这样的东西会出现在 HTML 中:

<img id="photo"
     src="a_really_big_file.jpg"
     alt="this is some alt text"
     title="this is some title text" />

有没有办法让我确定标签中src图像img是否已下载?

我需要这个,因为如果$(document).ready()在浏览器加载图像之前执行,我会遇到问题$("#photo").width()并且$("#photo").height()将返回占位符(alt文本)的大小。就我而言,这类似于 134 x 20。

现在我只是检查照片的高度是否小于 150,并假设如果是,它只是替代文本。但这是一个相当大的黑客,如果照片高度小于 150 像素(在我的特定情况下不太可能),或者替代文本高度超过 150 像素(可能发生在小浏览器窗口上),它会中断.


编辑:对于任何想要查看代码的人:

$(function()
{
  var REAL_WIDTH = $("#photo").width();
  var REAL_HEIGHT = $("#photo").height();

  $(window).resize(adjust_photo_size);
  adjust_photo_size();

  function adjust_photo_size()
  {
    if(REAL_HEIGHT < 150)
    {
      REAL_WIDTH = $("#photo").width();
      REAL_HEIGHT = $("#photo").height();
      if(REAL_HEIGHT < 150)
      {
        //image not loaded.. try again in a quarter-second
        setTimeout(adjust_photo_size, 250);
        return;
      }
    }

    var new_width = . . . ;
    var new_height = . . . ;

    $("#photo").width(Math.round(new_width));
    $("#photo").height(Math.round(new_height));
  }

});

更新:感谢您的建议。如果我为$("#photo").load事件设置回调,则存在事件不被触发的风险,因此我直接在图像标签上定义了一个 onLoad 事件。作为记录,这是我最终使用的代码:

<img id="photo"
     onload="photoLoaded();"
     src="a_really_big_file.jpg"
     alt="this is some alt text"
     title="this is some title text" />

然后在 Javascript 中:

//This must be outside $() because it may get called first
var isPhotoLoaded = false;
function photoLoaded()
{
  isPhotoLoaded = true;
}

$(function()
{
  //Hides scrollbars, so we can resize properly.  Set with JS instead of
  //  CSS so that page doesn't break with JS disabled.
  $("body").css("overflow", "hidden");

  var REAL_WIDTH = -1;
  var REAL_HEIGHT = -1;

  $(window).resize(adjust_photo_size);
  adjust_photo_size();

  function adjust_photo_size()
  {
    if(!isPhotoLoaded)
    {
      //image not loaded.. try again in a quarter-second
      setTimeout(adjust_photo_size, 250);
      return;
    }
    else if(REAL_WIDTH < 0)
    {
      //first time in this function since photo loaded
      REAL_WIDTH = $("#photo").width();
      REAL_HEIGHT = $("#photo").height();
    }

    var new_width = . . . ;
    var new_height = . . . ;

    $("#photo").width(Math.round(new_width));
    $("#photo").height(Math.round(new_height));
  }

});
6个回答

添加一个事件侦听器,或者让图像通过 onload 宣布自己。然后从那里找出尺寸。

<img id="photo"
     onload='loaded(this.id)'
     src="a_really_big_file.jpg"
     alt="this is some alt text"
     title="this is some title text" />
我已经在 IE6、IE7、FF3、Opera9、Safair (Windows Beta) 和 Chrome (Windows Beta) 中对其进行了测试。
2021-03-16 18:39:48
不鼓励乱七八糟的行为和内容。事件应该使用 Javascript 来应用,而不是在 HTML 中。
2021-03-22 18:39:48
他的评论是相关的,因为我们并没有停留在 2008 年。人们仍然在读这个,即使它在 08 年不被认为是不好的做法,你也不希望人们现在认为它是好的做法。
2021-03-24 18:39:48
document.querySelector("img").addEventListener("load", function() { alert('onload!'); });
2021-04-06 18:39:48
根据规范,onload 只是 body 和 frameset 元素的事件;也就是说,我认为这在 IE 中有效,但我不知道它在任何其他浏览器中是否有效,或者您可以假设它是什么……我几周前刚刚研究过这个……
2021-04-07 18:39:48

使用jquery 数据存储,您可以定义“加载”状态。

<img id="myimage" onload="$(this).data('loaded', 'loaded');" src="lolcats.jpg" />

然后在其他地方你可以这样做:

if ($('#myimage').data('loaded')) {
    // loaded, so do stuff
}
使用jQuery(this)而不是$(this)为了与其他库更好的兼容性(jquery 不拥有 $),尤其是当您在 html 中有 JavaScript 时。
2021-04-05 18:39:48

正确的答案是使用event.special.load

如果图片是从浏览器缓存加载的,则有可能不会触发 load 事件。为了解决这种可能性,我们可以使用一个特殊的加载事件,如果图像准备好,它会立即触发。event.special.load 目前可作为插件使用。

根据.load()上的文档

我打算用这样的建议添加一个答案,很高兴我在编码之前看到了这个答案。基本上,您的处理程序需要在设置处理程序之前首先检查图像是否已加载。如果它已经加载,立即触发回调。这就是它的$.ready作用。我打算建议只检查宽度,但这有其问题,我真的很喜欢那个解决方案。
2021-03-17 18:39:48

你想按照艾伦所说的去做,但是要注意有时图像在 dom 准备好之前加载,这意味着你的加载处理程序不会触发。最好的方法是按照 Allain 说的做,但是在附加加载处理程序后使用 javascript 设置图像的 src。这样你就可以保证它会触发。

在可访问性方面,您的网站是否仍然适用于没有 JavaScript 的人?您可能希望为 img 标记提供正确的 src,附加 dom 就绪处理程序以运行您的 js:清除图像 src(使用 css 为其提供固定的宽度和高度以防止页面闪烁),然后设置您的 img 加载处理程序,然后将 src 重置为正确的文件。这样你就涵盖了所有的基础:)

该网站仍然适用于没有 Javascript 的人,他们只需要滚动即可查看所有图像。
2021-03-25 18:39:48

根据最近对您原始问题的评论之一

$(function() {

  $(window).resize(adjust_photo_size);
  adjust_photo_size();

  function adjust_photo_size()  {
    if (!$("#photo").get(0).complete) {
       $("#photo").load(function() {
          adjust_photo_size();
       });
    } else {
      ... 
    }
});

警告这个答案可能会导致 ie8 及更低版本的严重循环,因为浏览器并不总是正确设置 img.complete。如果你必须支持ie8,使用一个标志来记住图像被加载。

拿着它。这个答案可能会导致 ie8 及更低版本的严重循环,因为浏览器并不总是正确设置 img.complete。如果你必须支持ie8,使用一个标志来记住图像被加载。
2021-04-07 18:39:48