var retries = 0;
$.imgReload = function() {
var loaded = 1;
$("img").each(function() {
if (!this.complete || typeof this.naturalWidth == "undefined" || this.naturalWidth == 0) {
var src = $(this).attr("src");
var date = new Date();
$(this).attr("src", src + "?v=" + date.getTime()); //slightly change url to prevent loading from cache
loaded =0;
}
});
retries +=1;
if (retries < 10) { // If after 10 retries error images are not fixed maybe because they
// are not present on server, the recursion will break the loop
if (loaded == 0) {
setTimeout('$.imgReload()',4000); // I think 4 seconds is enough to load a small image (<50k) from a slow server
}
// All images have been loaded
else {
// alert("images loaded");
}
}
// If error images cannot be loaded after 10 retries
else {
// alert("recursion exceeded");
}
}
jQuery(document).ready(function() {
setTimeout('$.imgReload()',5000);
});
function imgExists(imgPath) {
var http = jQuery.ajax({
type:"HEAD",
url: imgPath,
async: false
});
return http.status != 404;
}
function handleImageError() {
var imgPath;
$('img').each(function() {
imgPath = $(this).attr('src');
if (!imgExists(imgPath)) {
$(this).attr('src', 'images/noimage.jpg');
}
});
}
3
jQuery 1.8
// If missing.png is missing, it is replaced by replacement.png
$( "img" )
.error(function() {
$( this ).attr( "src", "replacement.png" );
})
.attr( "src", "missing.png" );
jQuery 3
// If missing.png is missing, it is replaced by replacement.png
$( "img" )
.on("error", function() {
$( this ).attr( "src", "replacement.png" );
})
.attr( "src", "missing.png" );
30 回答
这是一个独立的解决方案:
我相信这就是你所追求的:jQuery.Preload
这是演示中的示例代码,您指定了加载和未找到的图像,并且您已全部设置:
资料来源:http://www.developria.com/2009/03/jquery-quickie---broken-images.html
这是一种糟糕的技术,但它几乎得到了保证:
虽然OP希望取代SRC,但我确信很多人在打这个问题时可能只想隐藏破碎的图像,在这种情况下this simple solution对我来说很有用:
这是一种快速而又脏的方法来替换所有损坏的图像,并且无需更改HTML代码;)
codepen example
处理图像的
onError
事件以使用JavaScript重新分配其源:或者没有JavaScript功能:
以下兼容性表列出了支持错误工具的浏览器:
http://www.quirksmode.org/dom/events/error.html
我使用内置的
error
处理程序:error()
在1.8或更高版本中已弃用 .如果像我这样的人尝试将
error
事件附加到动态HTMLimg
标记,我想指出,有一个问题:显然
img
错误事件 don't bubble 在大多数浏览器中,与standard所说的相反 .所以,如下所示将 not work :
希望这对其他人有所帮助 . 我希望我在这个帖子中看到过这个 . 但是,我没有 . 所以,我正在添加它
我找不到适合我需要的脚本,所以我做了一个递归函数来检查损坏的图像,并尝试每四秒重新加载一次,直到它们被修复 .
我把它限制为10次尝试,好像它没有被加载,然后图像可能不存在于服务器上,并且该函数将进入无限循环 . 我还在测试 . 随意调整它:)
您可以使用GitHub自己的提取:
前端:https://github.com/github/fetch
或者对于Backend,一个Node.js版本:https://github.com/bitinn/node-fetch
编辑:这种方法将取代XHR,据说已经在Chrome中 . 对于将来阅读此内容的任何人,您可能不需要包含上述库 .
这是JavaScript,应该是跨浏览器兼容的,并且没有丑陋的标记
onerror=""
:CODEPEN:
更好的使用电话
因为使用
document.ready
并不一定意味着加载图像,只加载HTML . 因此,不需要延迟呼叫 .CoffeeScript变种:
我用它修复了Turbolinks的问题,导致.error()方法有时会在Firefox中引发,即使图像真的存在 .
通过使用Prestaul's answer,我添加了一些检查,我更喜欢使用jQuery方式 .
如果您已将
img
与innerHTML
一起插入,例如:$("div").innerHTML = <img src="wrong-uri">
,则可以加载另一个图像,如果它失败,例如:为什么需要
javascript: _
?因为通过innerHTML
中的脚本标记注入到DOM中的脚本在注入它们时不会运行,所以您必须是显式的 .我在看this other SO post时发现了这篇文章 . 以下是我在那里给出的答案的副本 .
我知道这是一个老线程,但React已经变得流行,也许,使用React的人会来这里寻找同样问题的答案 .
所以,如果您使用的是React,您可以执行以下操作,这是React团队的Ben Alpert提供的答案原件here
我创建了一个fiddle来使用"onerror"事件替换损坏的图像 . 这可能对你有所帮助 .
下面是使用JQuery包装的HTML5 Image对象的示例 . 调用主映像URL的加载函数,如果该加载导致错误,请使用备份URL替换映像的src属性 .
纯JS . 我的任务是:如果图像'bl-once.png'为空 - >插入第一个(没有404状态)数组列表中的图像(在当前目录中):
也许它需要改进,但是:
因此,它会将正确的'needed.png'插入我的src或'no-image.png'从当前目录 .
我不确定是否有更好的方法,但我可以想到一个hack来获取它 - 你可以将Ajax发布到img URL,并解析响应以查看图像是否实际返回 . 如果它以404或者其他形式返回,那么换掉img . 虽然我希望这个很慢 .
我用这两个简单的函数解决了我的问题:
jQuery 1.8
jQuery 3
reference
您可以传递占位符路径,并通过
$*
从失败的图像对象中访问其中的所有属性:http://jsfiddle.net/ARTsinn/Cu4Zn/
这让我多年来一直很沮丧 . 我的CSS修复程序在
img
上设置了背景图像 . 当动态图像src
未加载到前景时,img
的bg上会显示占位符 . 如果您的图像具有默认大小(例如height
,min-height
,width
和/或min-width
),则此方法有效 .你会看到破碎的图像图标,但这是一个改进 . 成功测试了IE9 . iOS Safari和Chrome甚至没有显示损坏的图标 .
添加一个小动画,以便在没有背景闪烁的情况下加载
src
时间 . Chrome在后台平滑淡出,但桌面Safari却没有 .如果无法加载图像(例如,因为它不在提供的URL中),图像URL将更改为默认值,
有关.error()的更多信息
即使备份图片无法加载,我认为我在
window
的error
上有一个更优雅的事件委派和事件捕获方式 .重点是 :
将代码放在
head
中并作为第一个内联脚本执行 . 因此,它会监听脚本之后发生的错误 .使用事件捕获来捕获错误,尤其是对于那些不冒泡的事件 .
使用事件委托,避免在每个图像上绑定事件 .
在给出
backup.png
之后给错误img
元素一个属性,以避免backup.png
和随后的无限循环消失,如下所示:img error->backup.png->error->backup.png->error->,,,,,
我遇到了同样的问题 . 这段代码适合我的情况 .
有时使用
error
事件是不可行的,例如因为您正在尝试在已加载的页面上执行某些操作,例如当您通过控制台运行代码,书签或异步加载的脚本时 . 在这种情况下,检查img.naturalWidth
和img.naturalHeight
是0似乎可以解决问题 .例如,这是一个从控制台重新加载所有损坏图像的片段:
我使用下面的代码,首先尝试根据用户ID找到当前用户的头像,在这种情况下是“123”,如果找不到头像图像,则错误代码会将img src更改为占位符图像 .