我已经有两天的问题了,而我正处于突破点。我想在图像无法加载时更改图像的图像src
(图像不存在)。
在以下示例中,前两个图像确实存在,但所有图像src
都被错误事件替换。
https://jsfiddle.net/zq5tsbmj/
var errorHandler = function(imageParsed) {
imageParsed.src = "http://www.theemailcompany.com/wp-content/uploads/2016/02/no-image-placeholder-big-300x200.jpg";
};
var imgs = document.getElementsByTagName("img"),
len = imgs.length;
for (var i = 0, lenImage = len; i < lenImage; i++) {
imgs[i].onerror = errorHandler(imgs[i]);
}
我认为这是因为事件运行得太快了。所以按照this question我以事件方式分配了它
https://jsfiddle.net/zq5tsbmj/1/
var errorHandler = function(imageParsed) {
imageParsed.src = "http://www.theemailcompany.com/wp-content/uploads/2016/02/no-image-placeholder-big-300x200.jpg";
alert('error');
};
var imgs = document.getElementsByTagName("img"),
len = imgs.length;
for (var i = 0, lenImage = len; i < lenImage; i++) {
imgs[i].onerror = function() {
errorHandler(imgs[i]);
};
}
但即使最后一张图像失败,这也不会触发错误功能。
<小时/> 有人可以向我解释一下我究竟做错了什么。请不要提供其他问题的链接。我真的想简单地说明为什么这段代码没有完全按照预期工作,解决方案是什么,否则我担心我不会从中学习。感谢。
答案 0 :(得分:0)
你在两种情况下都犯了错误
案例1
你的for循环应该分配函数而不是函数的返回值,使其成为
for (var i = 0, lenImage = len; i < lenImage; i++) {
imgs[i].onerror = errorHandler;
}
案例2
Onerror
是异步调用的,所以i
的值必须先锁定才能将其传递给函数
for (var i = 0, lenImage = len; i < lenImage; i++) {
imgs[i].onerror = function( i ) {
errorHandler(imgs[i]);
};
}
答案 1 :(得分:0)
在我们加载页面本身的第一种情况https://jsfiddle.net/zq5tsbmj/
中,下面的代码正在执行,
for (var i = 0, lenImage = len; i < lenImage; i++) {
imgs[i].onerror = errorHandler(imgs[i]);
}
此时,errorHandler
功能正在执行,所有图像都会被替换。
在我们加载页面本身的第二种情况https://jsfiddle.net/zq5tsbmj/1/
中,下面的代码正在执行,
for (var i = 0, lenImage = len; i < lenImage; i++) {
imgs[i].onerror = function() {
errorHandler(imgs[i]);
};
}
这里我们只是将事件与图像绑定,但它不会被执行。
要使其有效,请在所有Image
标记中添加名为onerror="errorHandler(this)"
的事件
<img src="http://artandcraftdays.co.uk/wp-content/uploads/2015/07/buterfly_and_drops-263x300.png" width="100" onerror="errorHandler(this)"/>
<img src="https://www.chromacolour.co.uk/media/catalog/category/art-supplies_5.jpg" width="100" onerror="errorHandler(this)"/>
<img src="https://www.exagggggmple.com/media/doesnt-exists.jpg" width="100" onerror="errorHandler(this)"/>
并且下面只有一个function
并删除其他脚本。
var errorHandler = function(imageParsed) {
imageParsed.src = "http://www.theemailcompany.com/wp-
content/uploads/2016/02/no-image-placeholder-big-300x200.jpg";
alert('error');
};
这将按预期工作。