src
属性が無効な場合にHTMLの<img>
タグにデフォルトの画像をレンダリングする方法はありますか(HTMLのみを使用)。そうでなければ、それを回避するためのあなたの軽量な方法は何でしょうか?
あなたはHTMLのみの解決策を求めています...
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<title>Object Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>
<object data="http://stackoverflow.com/does-not-exist.png" type="image/png">
<img src="https://appharbor.com/assets/images/stackoverflow-logo.png" alt="example">
</object>
</p>
</body>
</html>
最初の画像が存在しないため、フォールバック(Stack Overflowロゴ)が表示されます。そして、本当に古いブラウザで object
をサポートしていないブラウザを使っているのであれば、そのタグを無視して使うだけです。 img
タグ互換性については caniuse のWebサイトを参照してください。 2018年現在、この要素はie6 +以降のすべてのブラウザで幅広くサポートされています。
これは私にはうまくいきます。イベントをフックするためにJQueryを使いたいのかもしれません。
<img src="foo.jpg" onerror="if (this.src != 'error.jpg') this.src = 'error.jpg';">
Jacquargsエラーガードで更新
更新:CSSのみの解決方法私が最近見た Vitaly Friedman デモ私が知らなかった素晴らしいCSSの解決方法。考えは壊れたイメージにcontent
プロパティを適用することです。通常:after
や:before
は画像には適用されませんが、壊れている場合は適用されます。
<img src="nothere.jpg">
<style>
img:before {
content: ' ';
display: block;
position: absolute;
height: 50px;
width: 50px;
background-image: url(ishere.jpg);
</style>
デモ: https://jsfiddle.net/uz2gmh2k/2/
フィドルが示すように、壊れたイメージ自体は削除されませんが、これはおそらくJSもCSSの塊もなく、ほとんどの場合問題を解決するでしょう。異なる場所に異なる画像を適用する必要がある場合は、単にクラスで区別します。.my-special-case img:before { ...
Spring in Action 3rd Edでこの解決策を見つけました。
<img src="../resources/images/Image1.jpg" onerror="this.src='../resources/images/none.jpg'" />
更新:これはHTMLのみの解決策ではありません... onerror
はjavascriptです。
<style type="text/css">
img {
background-image: url('/images/default.png')
}
</style>
必ず画像の寸法を入力し、画像を並べて表示するかどうかを入力してください。
HTMLだけでは不可能だと思います。しかし、JavaScriptを使用すると、これは実行可能になるはずです。基本的に各画像をループして、それが完成しているかどうかをテストし、それがnaturalWidthがゼロである場合、それはそれが見つからないことを意味します。これがコードです:
fixBrokenImages = function( url ){
var img = document.getElementsByTagName('img');
var i=0, l=img.length;
for(;i<l;i++){
var t = img[i];
if(t.naturalWidth === 0){
//this image is broken
t.src = url;
}
}
}
このように使用してください。
window.onload = function() {
fixBrokenImages('example.com/image.png');
}
ChromeとFirefoxでテスト済み
もしAngular/jQueryを使っているなら、これは役に立つかもしれません...
<img ng-src="{{item.url}}" altSrc="{{item.alt_url}}" onerror="this.src = $(this).attr('altSrc')">
説明
item
がnullの可能性があるプロパティurl
を持つと仮定すると、それがイメージであると壊れているように見えます。これにより、前述のようにonerror
属性式の実行がトリガーされます。上記のようにsrc
属性をオーバーライドする必要がありますが、altSrcにアクセスするにはjQueryが必要になります。 Vanilla JavaScriptでは機能しませんでした。
ちょっと厄介に思えるかもしれませんが、私のプロジェクトでその日を節約しました。
<img style="background-image: url(image1), url(image2);"></img>
背景画像を使用すると、複数の画像を追加できます。私の場合、image1がメイン画像です。これはどこかの場所から取得されます(ブラウザはリクエストを行います)。image2はimage1がロードされている間に表示されるデフォルトのローカル画像です。 image1が何らかのエラーを返した場合、ユーザーには何の変更も表示されず、これはユーザーエクスペリエンスにとってきれいです。
HTMLのみのソリューション。唯一の要件は、挿入しているイメージのサイズを知っていることであることです。フィラーとしてbackground-image
を使用しているため、透明な画像には機能しません。
指定された画像が見つからない場合に表示される画像をリンクするためにbackground-image
を正常に使用できます。それから唯一の問題は壊れたアイコン画像です - 非常に大きな空の文字を挿入することによってそれを削除することができます、それでimg
の表示の外側で内容を押します。
img {
background-image: url("http://placehold.it/200x200");
overflow: hidden;
}
img:before {
content: " ";
font-size: 1000px;
}
This image is missing:
<img src="a.jpg" style="width: 200px; height: 200px"/><br/>
And is displaying the placeholder
CSSのみのソリューション(Webkitのみ)
img:before { content: " "; font-size: 1000px; background-image: url("http://placehold.it/200x200"); display: block; width: 200px; height: 200px; position: relative; z-index: 0; }
This image is there: <img src="http://placehold.it/100x100"/><br/> This image is missing: <img src="a.jpg"/><br/> And is displaying the placeholder
または、jsfiddleの場合: https://jsfiddle.net/xehndm3u/9/
角度2:
<img src="{{foo.url}}" onerror="this.src='path/to/altimg.png'">
あなたのページを閲覧しようとする無数のクライアント(ブラウザ)を確認する方法はありません。考慮すべき1つの側面は、電子メールクライアントは事実上のWebブラウザであり、そのようなtrickamajickeryを処理できないかもしれないということです...
そのため、このように、デフォルトの幅と高さのalt/textも含める必要があります。これは純粋なHTMLソリューションです。
alt="NO IMAGE" width="800" height="350"
そのため、他の良い答えは次のように少し修正されます。
<img src="foo.jpg" onerror="if (this.src != 'error.jpg') this.src = 'error.jpg';" alt="NO IMAGE" width="800" height="350">
Chromeのobjectタグに問題がありましたが、これにも当てはまると思います。
あなたはさらに非常に大きくなるように代替テキストをスタイルすることができます...
だから私の答えはニースalt/textフォールバックでJavascriptを使うことです。
私はこれもおもしろいと思いました: 画像のalt属性をスタイルする方法
単純なimg要素はそれほど柔軟ではないので、私はそれをpicture要素と組み合わせました。このようにCSSは必要ありません。エラーが発生すると、すべてのsrcsetが代替バージョンに設定されます。リンク切れ画像は表示されません。不要なイメージバージョンはロードされません。 picture-elementは、レスポンシブデザインと、ブラウザでサポートされていないタイプの複数のフォールバックをサポートしています。
<picture>
<source id="s1" srcset="image1_not_supported_by_browser.webp" type="image/webp">
<source id="s2" srcset="image2_broken_link.png" type="image/png">
<img src="image3_fallback.jpg" alt="" onerror="this.onerror=null;document.getElementById('s1').srcset=document.getElementById('s2').srcset=this.src;">
</picture>
JQueryのモジュール化可能なバージョンで、ファイルの最後にこれを追加してください。
<script>
$(function() {
$('img[data-src-error]').error(function() {
var o = $(this);
var errorSrc = o.attr('data-src-error');
if (o.attr('src') != errorSrc) {
o.attr('src', errorSrc);
}
});
});
</script>
そしてimg
タグで:
<img src="..." data-src-error="..." />
上記の解決策は不完全です、属性src
が見つかりませんでした。
this.src
とthis.attribute('src')
は同じではありません、最初のものは画像への完全な参照を含みます、例えば、http://my.Host/error.jpg
、しかし、属性はちょうど元の値を保持します、error.jpg
正しい解決策
<img src="foo.jpg" onerror="if (this.src != 'error.jpg' && this.attribute('src') != 'error.jpg') this.src = 'error.jpg';" />
Angular 1.xを使用している場合は、任意の数の画像にフォールバックできるようにするディレクティブを含めることができます。 fallback属性は、単一のURL、配列内の複数のURL、またはスコープデータを使った角度表現をサポートします。
<img ng-src="myFirstImage.png" fallback="'fallback1.png'" />
<img ng-src="myFirstImage.png" fallback="['fallback1.png', 'fallback2.png']" />
<img ng-src="myFirstImage.png" fallback="myData.arrayOfImagesToFallbackTo" />
Angular Appモジュールに新しいフォールバックディレクティブを追加します。
angular.module('app.services', [])
.directive('fallback', ['$parse', function ($parse) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
var errorCount = 0;
// Hook the image element error event
angular.element(element).bind('error', function (err) {
var expressionFunc = $parse(attrs.fallback),
expressionResult,
imageUrl;
expressionResult = expressionFunc(scope);
if (typeof expressionResult === 'string') {
// The expression result is a string, use it as a url
imageUrl = expressionResult;
} else if (typeof expressionResult === 'object' && expressionResult instanceof Array) {
// The expression result is an array, grab an item from the array
// and use that as the image url
imageUrl = expressionResult[errorCount];
}
// Increment the error count so we can keep track
// of how many images we have tried
errorCount++;
angular.element(element).attr('src', imageUrl);
});
}
};
}])
動的Webプロジェクトを作成し、必要な画像をWebContentに配置した場合は、Spring MVCで以下のコードを使用して画像にアクセスできます。
<img src="Refresh.png" alt="Refresh" height="50" width="50">
また、imgという名前のフォルダを作成し、その画像をフォルダimgの中に置き、そのimgフォルダをWebContentの中に置くことで、以下のコードを使用してその画像にアクセスできます。
<img src="img/Refresh.png" alt="Refresh" height="50" width="50">
Patrick /素晴らしい答えに加えて、クロスプラットフォームの角度付きjsソリューションを探しているあなたのために、ここに行く:
<object type="image/png" data-ng-attr-data="{{ url || 'data:' }}">
<!-- any html as a fallback -->
</object>
これは私が正しい解決策を見つけることを試みて遊んでいた急落です: http://plnkr.co/edit/nL6FQ6kMK33NJeW8DVDY?p=preview
いくつかの良い答えとコメントを含むシンプルできちんとした解決策。
<img src="foo.jpg" onerror="this.src='error.jpg';this.onerror='';">
無限ループのリスクも解決します。
私のために働きました。
Jqueryを使うと、次のようなことができます。
$(document).ready(function() {
if ($("img").attr("src") != null)
{
if ($("img").attr("src").toString() == "")
{
$("img").attr("src", "images/default.jpg");
}
}
else
{
$("img").attr("src", "images/default.jpg");
}
});
どの画像でも、このJavaScriptコードを使用してください。
if (ptImage.naturalWidth == 0)
ptImage.src = '../../../../icons/blank.png';
ここでptImage
は、document.getElementById()
によって取得された<img>
タグアドレスです。
グーグルはこのページを "image fallback html"キーワードに捨てたが、上記のどれもが助けにならなかったので、そして私は "<svg fallback support IE below 9"を探していたのでこれは私が見つけたものです:
<img src="base-image.svg" alt="picture" />
<!--[if (lte IE 8)|(!IE)]><image src="fallback-image.png" alt="picture" /><![endif]-->
話題にはならないかもしれませんが、それは私自身の問題を解決し、他の人にも役立つかもしれません。