srcソース画像が見つからないときに「画像が見つかりません」アイコンを黙って隠す方法


91

画像ファイルが見つからないときに、レンダリングされたHTMLページから従来の「画像が見つかりません」アイコンを非表示にする方法を知っていますか?

JavaScript / jQuery / CSSを使用する作業方法はありますか?


Andyの回答は正しいですが、代わりにstyle.vsibilityを使用することもできます。可視性を設定しても、要素はドキュメント上でそのスペースを維持しているため、ドキュメントの面白い動きはありません。
クリスチャン、

要点はわかりません。あなたはあなたのHTMLコードから既存のリソースに到達しようとするだけではいけません。javascriptを使用して取引の悪いリソースを隠すことは、私にとっては醜い解決策のようです。
ボリスデロマス

1
@Kaaviar要点を逃しています。投稿時に画像を利用できても、数か月後には利用できなくなるため、スタックオーバーフローには多くのホットリンク画像が壊れています。これらの画像は静かに静かに隠されます。
systempuntoout 10/07/13

1
@systempuntoout:なぜこの2つが異なって扱われるのかよくわかりません。FirefoxとChromeで壊れた画像をテストしましたが、Firefoxでは表示されませんが、Chromeでは壊れているように見えます。これは、Firefoxが独自に決定しているものであることは明らかです。これは、どのスタイルもそれに影響を与えているようには見えないためです。ところで、StackPrinterの素晴らしい仕事です。
Andy E

2
@systempuntoout:Firefoxがこれでどのように機能するかについて、もう少し情報を見つけました。更新されたフィドルと[独自の疑似クラス:-moz-broken](developer.mozilla.org/en/CSS /: -moz- broken)をご覧ください。先ほど、疑似クラスが壊れた画像のスタイリングに役立つと思いました。
アンディE

回答:


102

あなたは使用することができonerror、画像の読み込みに失敗した時に動作するようにJavaScriptでイベントを:

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()があります。Web上の多くのサイトは、代わりにデフォルトの「画像なし」画像を使用し、src指定された画像の場所が利用できない場合にその画像を属性で指し示します。


1
andy-すべての画像に適用する「グローバル」ソリューションは何ですか?私はそれらがすべて同じdivにあれば十分簡単だと思います
jim tollan

@jAndy:私はそれが確かだとかなり確信していましたが、あなたのコメントで私は再確認しました。クイックGoogleは、クロスブラウザサポートを示すこのw3schoolsページ(これを読んでいる場合は申し訳ありませんがDavid)を返しました。
アンディE

2
@jim:jQueryを使用している場合は、すべての画像にイベントを適用できます。タグセレクターを使用するだけ$("img").error(function () { /*...*/ });です。
アンディE

@Andy E:いいですね、+ 1。次の興味深い質問は、「errorlive()または「」とバインド可能delegate()です。
jAndy

3
visibilitydisplayレイアウトを壊すことができるので、より良いでしょう。
gblazex 2010

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

残念ながら、htmlコンテンツがJsonを介してサードパーティのWebサイトからダウンロードされ、編集できないため、このソリューションを使用できません。とにかくありがとう。
systempuntoout 2010

9
すごい、ちょうど私が必要としたもの。シンプルで邪魔にならない、テンプレートに収まります!
マックス

すでにかなり古いですが、これは素晴らしいです!現在非表示になっている画像を囲む<a>タグも非表示にする方法はありますか?
SJDS 2016年

9

壊れた画像アイコンが簡単に表示されるため、Gary Willoughbyによって提案されたソリューションを少し変更しました。私の解決策:

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

私のソリューションでは、イメージは最初は非表示で、正常にロードされた場合にのみ表示されます。これには欠点があります。ユーザーにはハーフロードされた画像が表示されません。ユーザーがJSを無効にした場合、画像は表示されません


1
... JavaScriptが無効になっている場合、ユーザーには何も表示されません。
yckart 2016年

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ロードをブロックすると、イメージエラーの後に実行される可能性があります。
ガラティア人

これは私にとってはうまくいきますが、ガラティアからのアドバイスとともに、遅延させる可能性のある何かの前にこのJSを実行する必要があります。
Adamz 2016

これは元の質問に答えますが、一方向のプロセスです。後で読み込まれる画像を再び表示するには、onloadイベントも追加します。allimgs [i] .onload = function(){this.style.visibility = "visible"; };
TRT 1968

5

少し遅れるかもしれませんが、これが私の試みです。同じ問題に直面したときに、画像のサイズのdivを使用してbackground-imageをこのdivに設定することで修正しました。画像が見つからない場合、divは透明にレンダリングされるため、JavaScriptスクリプトを使用せずにすべてが黙って行われます。


4

アンディ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

@Andy E:ええ、彼らはすでにそれを回避しましたが、で同様のことをするのに最悪のアイデアではないかもしれませんerror。音が好きなnice 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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.