找不到src源图像时,如何静默隐藏“找不到图像”图标


91

您是否知道在找不到图像文件时如何从呈现的HTML页面中隐藏经典的“未找到图像”图标?

有使用JavaScript / jQuery / CSS的工作方法吗?


安迪的回答是正确的,但是,您可能想改用style.vsibility。如果设置可见性,则该元素仍保留其空间在文档上,因此不会出现有趣的文档移动。
克里斯蒂安

我不明白这一点。您只是不应该尝试从html代码中获取现有资源。使用javascript隐藏不良交易资源对我来说似乎是一个丑陋的解决方案。
鲍里斯·德洛玛斯

1
@Kaaviar您错过了要点。由于在发布时可以使用图像,但是几个月后不可用,因此在Stack Overflow上有很多热链接图像都已损坏。这些图像被悄悄地隐藏起来。
systempuntoout 2010年

1
@systempuntoout:我不确定为什么将两者区别对待。在Firefox和Chrome中测试了损坏的图像,它在Firefox中没有显示,但在Chrome中显示为损坏。显然,这是Firefox自己决定的事情,因为似乎没有任何样式在影响它。顺便说一句,在StackPrinter上做得很好。
安迪E

2
@systempuntoout:我发现了更多有关Firefox如何工作的信息。请参阅更新的小提琴和[专有伪类:-moz-broken](developer.mozilla.org/en/CSS/: -moz- broken)。我刚才只是想对自己说,伪类对于样式化损坏的图像很有用。
安迪E

Answers:


102

您可以使用onerrorJavaScript中的事件来在图像加载失败时采取行动:

var img = document.getElementById("myImg");
img.onerror = function () { 
    this.style.display = "none";
}

在jQuery中(自您询问之后):

$("#myImg").error(function () { 
    $(this).hide(); 
});

或对于所有图像:

$("img").error(function () { 
    $(this).hide();
    // or $(this).css({visibility:"hidden"}); 
});

如果隐藏图像可能会更改布局,则应使用visibility: hidden代替.hide()。网络上的许多站点都使用默认的“无图像”图像,src当指定的图像位置不可用时,将属性指向该图像。


1
安迪-适用于所有图像的“全局”解决方案是什么?我想如果它们都在同一个div中就很容易了-只想知道文档中的所有图像...
jim tollan 2010年

@jAndy:我相当确定,但是您的评论让我仔细检查了。快速的Google返回了此w3schools页面(抱歉,如果您正在阅读的话,David),这表明跨浏览器支持。
Andy E

2
@jim:如果使用的是jQuery,则可以将该事件应用于所有图像。只需使用标签选择器即可,例如$("img").error(function () { /*...*/ });
安迪E

@Andy E:听起来不错,+ 1。下一个有趣的问题是,“ error”是否与live()or 绑定delegate()
jAndy

3
visibility会更好,因为这样display会破坏布局。
gblazex

114
<img onerror='this.style.display = "none"'>

不幸的是,我无法使用此解决方案,因为html内容是通过Json从第三方网站下载的,我无法对其进行编辑。不管怎么说,还是要谢谢你。
systempuntoout 2010年

9
太棒了,正是我所需要的。简单无阻,适合模板!
2013年

虽然已经很老了,但是很棒!有没有办法隐藏我现在隐藏的图像周围的<a>标签?
SJDS

9

我已经稍微修改了Gary Willoughby建议的解决方案,因为它会短暂显示损坏的图像图标。我的解决方案:

    <img src="..." style="display: none" onload="this.style.display=''">

在我的解决方案中,图像最初是隐藏的,仅在成功加载后才显示。它有一个缺点:用户将看不到一半加载的图像。如果用户禁用了JS,那么他们将永远看不到任何图像


1
...如果禁用了javascript,用户将看不到任何内容!
yckart '16

4
@yckart好吧,如果用户禁用了javascript,无论如何,大多数有用的Web应用程序将无法正常工作……
敬畏

<img src="..." onerror="this.style.display = 'none'"/>在半加载和非js浏览器的情况下可能会更好?

6

要隐藏每个图像错误,只需在页面底部(就在body标记之前)添加以下JavaScript:

(function() {
    var allimgs = document.images;
    for (var i = 0; i < allimgs.length; i++) {
        allimgs[i].onerror = function() {
            this.style.visibility = "hidden"; // Other elements aren't affected. 
        }
    }
})();

这是我的首选方法,因为它可以确保在图像出错之前绑定onerror事件,并且您不必向每个图像标签添加onerror属性。请确保将此代码放在所有图像标记之后,然后放在<body>中的任何其他JavaScript之前,否则,阻止外部JS加载可能会导致图像错误后执行。
加拉太书,2015年

这对我有用,再加上加拉太书的建议,需要先执行此JS,然后再执行可能会延迟它的操作。
Adamz '16

这回答了原始问题,但这是一个单向过程。要使随后加载的图像再次可见,还可以添加onload事件。allimgs [i] .onload = function(){this.style.visibility =“ visible”; };
TRT 1968年

5

答案可能为时不晚,但这是我的尝试。当我遇到相同的问题时,我通过使用图像大小的div并将该背景图像设置为此div来修复它。如果未找到该图像,则div将呈现为透明,因此无需Java脚本代码即可静默完成所有操作。


4

快速研究 Andy E的答案,不可能将其live()束缚error

// won't work (chrome 5)
$('img').live('error', function(){
     $(this).css('visibility', 'hidden');
});

所以你必须像

$('<img/>', {
  src:    'http://www.notarget.com/fake.jpg',
  error:  function(e){
    $(this).css('visibility', 'hidden');
  }
}).appendTo(document.body);

直接绑定error event handler创建新元素。


2
+1,其原因是onerror DOM事件不会冒泡。 通过将事件处理程序放置在DOM层次的更上层并在事件冒泡时捕获事件,来进行实时工作并委派工作。当然,jQuery开发人员已经针对诸如聚焦模糊之
Andy E 2010年

@Andy E:是的,他们已经解决了这一问题,对于进行类似操作可能不是最坏的主意errornice to have对我来说听起来像是一个。
jAndy

3

我发现了一个很好的方法来做到这一点,同时ng-src在Angular.js中使用指令时仍能正常工作,就像...

<img
  ng-src="{{myCtrl.myImageUrlThatWillDynamicallyChange}}" 
  onerror="this.src='data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='"
  />

它基本上是最短的透明GIF(如 http://proger.i-forge.net/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82% D0%B5%D1%80 / [20121112]%20The%20smallest%20transparent%20pixel.html

当然,此gif可以保留在某些全局变量内,这样就不会弄乱模板。

<script>
  window.fallbackGif = "..."
</script>

和使用

<img
  ng-src="{{myCtrl.myImageUrlThatWillDynamicallyChange}}" 
  onerror="this.src=fallbackGif"
  />

等等


0

只需使用简单的CSS

.AdminImageHolder {
display: inline-block;
min-width: 100px;
max-width: 100px;
min-height: 100px;
max-height: 100px;
background: url(img/100x100.png) no-repeat;
border: 1px solid #ccc;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.