HTML img タグで画像が 404 エラーのときに代替画像を表示する方法
はじめに
<img src="xxxx.png">
で xxxx.png
が 404 エラーとなったときに、デフォルトで代わりの画像を表示する方法をまとめた。
TL;DR
onerror="this.src = 'alt.png'; this.removeAttribute('onerror')"
を指定- エラー時には代替画像を読み込んで、
onerror
属性自身も削除
- エラー時には代替画像を読み込んで、
onload="this.removeAttribute('onerror'); this.removeAttribute('onload');
も一緒に指定- エラー無し時に
onerror
,onload
属性を消せる
- エラー無し時に
- 上記をまとめると以下
1 | <img src="404.png" |
※MDN によると onerror
は非推奨、ご利用は計画的に
目次
詳細
まずは動作イメージ。
See the Pen [HTML] img タグで 404 エラー発生時に代替画像を表示 by 17num (@17num) on CodePen.
画像にアクセスできない場合の挙動
img
タグで、src
に指定した画像にアクセスできない場合には、おなじみの壊れた写真アイコン(下記)が表示される。
onerror で代替画像を表示する
画像にアクセスできないときに、代替画像を表示するには onerror
属性を指定すると簡単に src
の変更ができる。
onerror
の中身は JavaScript。
1 | <img src="hoge.png" onerror="console.log('hello from onerror');"> |
onerror
で画像を差し替えるには this.src = 'xx'
とすれば OK。
1 | <img src="hoge.png" onerror="this.src = 'fuga.png';"> |
上記で hoge.png
にアクセスできなければ、hoge.png
が fuga.png
に差し替わる。
1 | <img src="fuga.png" onerror="this.src = 'fuga.png';"> |
このままだと以下の問題がある
fuga.png
もアクセスできない場合にonerror
を繰り返すonerror
が残ってダサい(個人の感想)
ということで、onerror
の処理の最後で onerror
を削除する。
1 | <img src="hoge.png" onerror="this.src = 'fuga.png'; this.removeAttribute('onerror')"> |
これで hoge.png
にアクセスできなければ、最終的にこうなる。
1 | <img src="fuga.png"> |
fuga.png
にもアクセスできなければ、例の壊れた写真が出るがもうどうしようも無い(と思う)
onload で onerror を削除する
onerror
を使うことで、src
にアクセスできない場合に画像を差し替えることができた。
が、逆に src
にアクセスできた場合 は、onerror
が残ってしまう。
1 | <!-- hoge.png が通常通り表示できた場合は onerror が削除されない --> |
画像表示できた場合に onerror
属性を消したい場合は onload
を使うと良い。
1 | <img src="hoge.png" |
これで hoge.png
が読み込めた場合は、以下のようになる。
1 | <img src="hoge.png" onload="this.removeAttribute('onerror')"> |
あとは onerror
の時と同じように onload
を削除する処理も追加すれば OK。
1 | <img src="hoge.png" |
なお onload
は onerror="this.src='fuga.png';
で画像を差し替え(て読み込み完了し)た時にも発火する。
なので、必ず代替画像にアクセスできるのであれば、this.removeAttribute('onload')
は onload
だけとしても良い。
1 | <img src="hoge.png" |
まとめ
onerror="this.src = 'alt.png'; this.removeAttribute('onerror')"
を指定- エラー時には代替画像を読み込んで、
onerror
属性自身も削除
- エラー時には代替画像を読み込んで、
onload="this.removeAttribute('onerror'); this.removeAttribute('onload');
も一緒に指定- エラー無し時に
onerror
,onload
属性を消せる
- エラー無し時に
- 上記をまとめると以下
1 | <img src="404.png" |
※MDN によると onerror
は非推奨、ご利用は計画的に
その他・メモ
非推奨となっている理由や影響はちゃんと見てない。あと、onerror
は IE, Edge 未対応(2019/11/23 現在)なので注意。
参考文献
- <img>: 埋め込み画像要素 - HTML: HyperText Markup Language | MDN
- javascript - Chrome Extension - Fix img tag onerror infinite loop - Stack Overflow
- HTML element: img: onerror - Can I use
- Can I use... Support tables for HTML5, CSS3, etc
- imgタグでエラー時の画像をonerror属性で設定する方法 - Qiita
- onerror - imgタグの画像が存在しなかったとき別画像を表示 : developppのblog
関連記事
- jQuery Select2 で、初期値の設定と選択状態のクリア
- JavaScript で画像をローカルにダウンロード
- JavaScript で複数画像を zip に圧縮してローカルにダウンロード
- mailto リンクで 宛先/CC/BCC/件名/本文 を指定 (JavaScript サンプルあり)
- Chart.js(vue-chartjs) でツールチップの表示内容を変更
- Vue.js で日本語変換での誤発火を抑止しつつ Enter キーで Submit
- JavaScript で URL のクエリパラメータを操作する方法
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)