saz*_*azr 88 javascript onerror imagesource image-loading
有没有办法确定图像路径是否会导致实际图像,即检测到图像无法在Javascript中加载.
对于Web应用程序,我正在解析xml文件并从图像路径列表中动态创建HTML图像.服务器上可能不再存在某些映像路径,因此我希望通过检测哪些映像无法加载并删除该HTML img元素来优雅地失败.
注意JQuery解决方案无法使用(老板不想使用JQuery,是的,我知道不要让我开始).我知道在JQuery中检测图像何时加载的方法,但不知道它是否失败.
我的代码创建img元素,但我如何检测img路径是否导致无法加载图像?
var imgObj = new Image(); // document.createElement("img");
imgObj.src = src;
Run Code Online (Sandbox Code Playgroud)
Nik*_*hil 101
您可以尝试以下代码.我不能担保浏览器兼容性,所以你必须测试它.
function testImage(URL) {
var tester=new Image();
tester.onload=imageFound;
tester.onerror=imageNotFound;
tester.src=URL;
}
function imageFound() {
alert('That image is found and loaded');
}
function imageNotFound() {
alert('That image was not found.');
}
testImage("http://foo.com/bar.jpg");
Run Code Online (Sandbox Code Playgroud)
我对jQuery抗性老板的同情!
emi*_*l.c 36
答案很好,但它引入了一个问题.无论何时分配onload或onerror直接分配,它都可以替换先前分配的回调.这就是为什么有一个很好的方法,就像在MDN 上所说的那样"在被调用的EventTarget上注册指定的监听器".您可以在同一事件中注册任意数量的侦听器.
让我稍微改写一下答案.
function testImage(url) {
var tester = new Image();
tester.addEventListener('load', imageFound);
tester.addEventListener('error', imageNotFound);
tester.src = url;
}
function imageFound() {
alert('That image is found and loaded');
}
function imageNotFound() {
alert('That image was not found.');
}
testImage("http://foo.com/bar.jpg");
Run Code Online (Sandbox Code Playgroud)
因为外部资源加载过程是异步的,所以使用具有promise的现代JavaScript会更好,例如以下内容.
function testImage(url) {
// Define the promise
const imgPromise = new Promise(function imgPromise(resolve, reject) {
// Create the image
const imgElement = new Image();
// When image is loaded, resolve the promise
imgElement.addEventListener('load', function imgOnLoad() {
resolve(this);
});
// When there's an error during load, reject the promise
imgElement.addEventListener('error', function imgOnError() {
reject();
})
// Assign URL
imgElement.src = url;
});
return imgPromise;
}
testImage("http://foo.com/bar.jpg").then(
function fulfilled(img) {
console.log('That image is found and loaded', img);
},
function rejected() {
console.log('That image was not found');
}
);
Run Code Online (Sandbox Code Playgroud)
小智 18
这个:
<img onerror="this.src='/images/image.png'" src="...">
Run Code Online (Sandbox Code Playgroud)
/**
* Tests image load.
* @param {String} url
* @returns {Promise}
*/
function testImageUrl(url) {
return new Promise(function(resolve, reject) {
var image = new Image();
image.addEventListener('load', resolve);
image.addEventListener('error', reject);
image.src = url;
});
}
return testImageUrl(imageUrl).then(function imageLoaded(e) {
return imageUrl;
})
.catch(function imageFailed(e) {
return defaultImageUrl;
});
Run Code Online (Sandbox Code Playgroud)
使用 jQuery,这对我有用:
$('img').error(function() {
$(this).attr('src', '/no-img.png').addClass('no-img');
});
Run Code Online (Sandbox Code Playgroud)
我可以在我的网站上的任何地方使用这张图片,无论它的大小如何,具有以下 CSS3 属性:
img.no-img {
object-fit: cover;
object-position: 50% 50%;
}
Run Code Online (Sandbox Code Playgroud)
提示 1:使用至少 800 x 800 像素的方形图像。
提示2:用于人物肖像,使用
object-position: 20% 50%;
对于缺少的背景图片,我还在每个background-image声明中添加了以下内容:
background-image: url('path-to-image.png'), url('no-img.png');
Run Code Online (Sandbox Code Playgroud)
注意:不适用于透明图像。
另一种解决方案是在发送到浏览器之前使用 Apache 检测丢失的图像并用默认的 no-img.png 内容替换它。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} /images/.*\.(gif|jpg|jpeg|png)$
RewriteRule .* /images/no-img.png [L,R=307]
Run Code Online (Sandbox Code Playgroud)
小智 5
更多关于 Rafael Martins 的答案,如果您使用 React,请使用以下代码:
<img
src="https://example.com/does_not_exist.png"
onError={(e) => {
e.currentTarget.src = "https://example.com/default.png"
}}
/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
84518 次 |
| 最近记录: |