javascript - 独立于浏览器的方法来检测何时加载图像

标签 javascript dom

在IE中,你可以onreadystatechange。有 onload,但我读了 scary things . jQuery 用“ready”很好地结束了 DOM 的加载事件。看来我只是不知道另一个不错的库的图像加载实现。

上下文是我正在动态生成图像(通过服务器回调),下载可能需要一些时间。在我的仅限 IE 的代码中,我设置了 img 元素的 src,然后当 onreadystatechange 事件以“完成”状态触发时,我将它添加到 DOM,以便用户看到它。

我会很高兴有一个“原生”JavaScript 解决方案,或者一个指向完成这项工作的库的指针。那里有很多图书馆,我敢肯定这是我的一个例子,只是不知道合适的图书馆。也就是说,我们已经是 jQuery 用户,所以我并不急于添加一个非常大的库来获得这个功能。

最佳答案

注意:我在 2010 年写了这篇文章,当时流行的浏览器是 IE 8/9 beta、Firefox 3.x 和 Chrome 4.x。请仅将其用于研究目的,我怀疑您能否将其复制/粘贴到现代浏览器中并使其正常运行。

警告:现在是 2017 年了,我仍然时不时地在这方面得到分数,请仅将其用于研究目的。我目前不知道如何检测图像加载状态,但可能有比这更优雅的方法......至少我真的希望有。我强烈建议不要在没有更多研究的情况下在生产环境中使用我的代码。

警告第二部分 Electric Boogaloo:现在是 2019 年,现在大多数 jQuery 功能都内置在 vanilla JS 中。如果您仍在使用它,可能是时候停止并考虑前往 MDN 了。并阅读 vanilla JS 必须提供的一些新的和有趣的东西。


我参加这个派对有点晚了,也许这个答案会对其他人有所帮助......

如果您使用的是 jQuery,请不要理会常用的事件处理程序(onclick/onmouseover/等),实际上完全停止使用它们即可。使用他们在 API 中提供的事件方法.


这会在图像附加到正文之前发出警报,因为当图像加载到内存中时会触发 load 事件。它完全按照您的指示进行操作:使用 test.jpg 的 src 创建图像,当加载 test.jpg 时发出警报,然后将其附加到正文。

var img = $('<img src="test.jpg" />');
img.load(function() {
    alert('Image Loaded');
});
$('body').append(img);

这将提醒,在将图像插入正文后,再次执行您告诉它的操作:创建图像,设置事件(未设置 src,因此尚未加载),将图像附加到正文(仍然没有 src),现在设置 src...现在图像已加载,因此事件被触发。

var img = $('<img />');
img.load(function() {
    alert('Image Loaded');
});
$('body').append(img);
$img.attr('src','test.jpg');

当然,您也可以添加错误处理程序并使用 bind() 合并一堆事件。

var img = $('<img />');
img.bind({
    load: function() {
        alert('Image loaded.');
    },
    error: function() {
        alert('Error thrown, image didn\'t load, probably a 404.');
    }
});
$('body').append(img);
img.attr('src','test.jpg');

根据@ChrisKempen 的要求...

这是一种非事件驱动的方法,用于确定加载 DOM 后图像是否损坏。此代码源自 StereoChrome 的一篇文章中的代码。它使用 naturalWidth、naturalHeight 和 complete 属性来确定图像是否存在。

$('img').each(function() {
    if (this.naturalWidth === 0 || this.naturalHeight === 0 || this.complete === false) {
        alert('broken image');
    }
});

关于javascript - 独立于浏览器的方法来检测何时加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/821516/

相关文章:

javascript - onkeydown 事件用于使用箭头键更改图像

java - 从 URL 获取标签之间的所有文本内容?

javascript - 获取元素的内部高度

javascript - React - 非常基本的开始

python - 我只想要 XML 元素的直接子元素,而不是所有后代

javascript - 通过javascript强制firefox在DOM解析中跳过 "text nodes"

javascript - Ajax 响应使用 Find 查找 HTML 片段

javascript - 谷歌地图在 map 上突出显示特定国家/地区

javascript - 测试使用 useEffect Hook 和 apollo 的自定义上下文 Hook

javascript - 使用 javascript 更改 anchor 标记的 href