在用户上传文件后,我们必须对图像进行一些额外的处理,例如调整大小并上传到 S3。这最多可能需要 10 秒的额外时间。显然,我们在后台执行此操作。但是,我们希望立即向用户显示结果页面,并简单地显示旋转器,直到图像在 s3 上到达他们的永久主页。
我正在寻找一种方法来检测某个图像无法以跨浏览器的方式正确加载(404)。如果发生这种情况,我们希望使用 JS 在它的位置显示一个微调器并每隔几秒钟重新加载图像,直到它可以从 s3 成功加载。
在用户上传文件后,我们必须对图像进行一些额外的处理,例如调整大小并上传到 S3。这最多可能需要 10 秒的额外时间。显然,我们在后台执行此操作。但是,我们希望立即向用户显示结果页面,并简单地显示旋转器,直到图像在 s3 上到达他们的永久主页。
我正在寻找一种方法来检测某个图像无法以跨浏览器的方式正确加载(404)。如果发生这种情况,我们希望使用 JS 在它的位置显示一个微调器并每隔几秒钟重新加载图像,直到它可以从 s3 成功加载。
处理<img>
元素的onerror
事件。
第一个选项:
<img src="picture1.gif" onerror="this.onerror=null;this.src='missing.gif';"/>
第二种选择:
<html>
<head>
<script type="text/javascript">
function ImgError(source){
source.src = "/noimage.gif";
source.onerror = "";
return true;
}
</script>
</head>
<body>
<img src="image_example1.jpg" onerror="ImgError(this)" />
</body>
</html>
PS:它是纯javascript!你不需要任何图书馆。(香草JS)
Fiddle 中的示例
来自:http : //lucassmith.name/2008/11/is-my-image-loaded.html
// First a couple helper functions
function $(id) {
return !id || id.nodeType === 1 ? id : document.getElementById(id);
}
function isType(o,t) { return (typeof o).indexOf(t.charAt(0).toLowerCase()) === 0;}
// Here's the meat and potatoes
function image(src,cfg) { var img, prop, target;
cfg = cfg || (isType(src,'o') ? src : {});
img = $(src);
if (img) {
src = cfg.src || img.src;
} else {
img = document.createElement('img');
src = src || cfg.src;
}
if (!src) {
return null;
}
prop = isType(img.naturalWidth,'u') ? 'width' : 'naturalWidth';
img.alt = cfg.alt || img.alt;
// Add the image and insert if requested (must be on DOM to load or
// pull from cache)
img.src = src;
target = $(cfg.target);
if (target) {
target.insertBefore(img, $(cfg.insertBefore) || null);
}
// Loaded?
if (img.complete) {
if (img[prop]) {
if (isType(cfg.success,'f')) {
cfg.success.call(img);
}
} else {
if (isType(cfg.failure,'f')) {
cfg.failure.call(img);
}
}
} else {
if (isType(cfg.success,'f')) {
img.onload = cfg.success;
}
if (isType(cfg.failure,'f')) {
img.onerror = cfg.failure;
}
}
return img;
}
以及如何使用它:
image('imgId',{
success : function () { alert(this.width); },
failure : function () { alert('Damn your eyes!'); },
});
image('http://somedomain.com/image/typooed_url.jpg', {
success : function () {...},
failure : function () {...},
target : 'myContainerId',
insertBefore : 'someChildOfmyContainerId'
});
只需在错误事件上绑定 attr 触发器。
$(myimgvar).bind('error',function(ev){
//error has been thrown
$(this).attr('src','/path/to/no-artwork-available.jpg');
}).attr('src',urlvar);
这对我有用(我的是咖啡脚本)。当然,您需要用微调器替换。
checkImages = ->
$("img").each ->
$(this).error ->
$(this).attr("src", "../default/image.jpg")
$(document).on('page:load', checkImages)
我猜 javascript 等价物类似于
function checkImages() {
$("img").each(function() {
$(this).error(function() {
$(this).attr("src", "../default/image.jpg");
});
});
};
$(document).on("page:load", checkImages);