Apakah ada cara untuk membuat gambar default dalam <img>
tag HTML , jika src
atributnya tidak valid (hanya menggunakan HTML)? Jika tidak, apa cara ringan Anda untuk mengatasinya?
Apakah ada cara untuk membuat gambar default dalam <img>
tag HTML , jika src
atributnya tidak valid (hanya menggunakan HTML)? Jika tidak, apa cara ringan Anda untuk mengatasinya?
Jawaban:
Anda meminta solusi hanya 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://cdn.sstatic.net/Img/unified/sprites.svg?v=e5e58ae7df45" alt="Stack Overflow logo and icons and such">
</object>
</p>
</body>
</html>
Karena gambar pertama tidak ada, fallback (sprite yang digunakan di situs web ini *) akan ditampilkan. Dan jika Anda menggunakan browser yang sangat lama yang tidak mendukung object
, itu akan mengabaikan tag itu dan menggunakan img
tag itu. Lihat situs web caniuse untuk kompatibilitas. Elemen ini didukung secara luas oleh semua browser dari IE6 +.
* Kecuali jika URL untuk gambar berubah (lagi), dalam hal ini Anda mungkin akan melihat teks alt.
X-Frame-Options
diatur ke SAMEORIGIN
atau pengaturan yang lebih permisif.
Ini bekerja dengan baik untuk saya. Mungkin Anda ingin menggunakan JQuery untuk mengaitkan acara.
<img src="foo.jpg" onerror="if (this.src != 'error.jpg') this.src = 'error.jpg';">
Diperbarui dengan jacquargs error guard
Diperbarui: solusi CSS saja.
Baru-baru ini saya melihat Vitaly Friedman mendemokan solusi CSS hebat yang tidak saya sadari. Idenya adalah untuk menerapkan content
properti ke gambar yang rusak. Biasanya :after
atau :before
tidak berlaku untuk gambar, tetapi ketika mereka rusak, mereka diterapkan.
<img src="nothere.jpg">
<style>
img:before {
content: ' ';
display: block;
position: absolute;
height: 50px;
width: 50px;
background-image: url(ishere.jpg);
</style>
Demo: https://jsfiddle.net/uz2gmh2k/2/
Seperti yang ditunjukkan biola, gambar yang rusak itu sendiri tidak dihapus, tetapi ini mungkin akan memecahkan masalah untuk sebagian besar kasus tanpa JS atau sekumpulan CSS. Jika Anda perlu menerapkan gambar yang berbeda di lokasi yang berbeda, cukup bedakan dengan kelas:.my-special-case img:before { ...
onerror="this.src='error.jpg';this.onerror='';"
Menemukan solusi ini di Spring in Action 3rd Ed.
<img src="../resources/images/Image1.jpg" onerror="this.src='../resources/images/none.jpg'" />
Pembaruan:
Ini bukan solusi hanya HTML ... onerror
adalah javascript
<img style="background-image: url(image1), url(image2);"></img>
Gunakan gambar latar belakang yang memungkinkan Anda menambahkan banyak gambar. Kasus saya: image1 adalah gambar utama, ini akan didapat dari suatu tempat (browser melakukan permintaan) image2 adalah gambar lokal default untuk ditampilkan saat image1 sedang dimuat. Jika image1 mengembalikan segala jenis kesalahan, pengguna tidak akan melihat perubahan apa pun dan ini akan bersih untuk pengalaman pengguna
<style type="text/css">
img {
background-image: url('/images/default.png')
}
</style>
Pastikan untuk memasukkan dimensi gambar dan apakah Anda ingin gambar untuk ubin atau tidak.
Saya pikir tidak mungkin menggunakan HTML saja. Namun menggunakan javascript ini harus bisa dilakukan. Dengan penuh semangat kami mengulangi setiap gambar, menguji apakah itu lengkap dan jika itu naturalWidth adalah nol maka itu berarti tidak ditemukan. Ini kodenya:
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;
}
}
}
Gunakan seperti ini:
window.onload = function() {
fixBrokenImages('example.com/image.png');
}
Diuji di Chrome dan Firefox
Jika Anda menggunakan Angular / jQuery maka ini mungkin membantu ...
<img ng-src="{{item.url}}" altSrc="{{item.alt_url}}" onerror="this.src = $(this).attr('altSrc')">
Penjelasan
Dengan asumsi bahwa item
memiliki properti url
yang mungkin nol, ketika itu maka gambar akan ditampilkan sebagai rusak. Itu memicu eksekusi onerror
ekspresi atribut, seperti dijelaskan di atas. Anda perlu mengganti src
atribut seperti yang dijelaskan di atas, tetapi Anda perlu jQuery untuk mengakses altSrc Anda. Tidak dapat membuatnya berfungsi dengan JavaScript vanilla.
Mungkin tampak sedikit macet tetapi menyelamatkan hari di proyek saya.
elemen img sederhana tidak terlalu fleksibel jadi saya menggabungkannya dengan elemen gambar. dengan cara ini tidak diperlukan CSS. ketika kesalahan terjadi, semua srcset diatur ke versi mundur. gambar tautan yang rusak tidak muncul. itu tidak memuat versi gambar yang tidak dibutuhkan. elemen gambar mendukung desain responsif dan beberapa fallback untuk jenis yang tidak didukung oleh browser.
<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>
angular2:
<img src="{{foo.url}}" onerror="this.src='path/to/altimg.png'">
Solusi sederhana dan rapi yang melibatkan beberapa jawaban dan komentar yang baik.
<img src="foo.jpg" onerror="this.src='error.jpg';this.onerror='';">
Bahkan memecahkan risiko loop tak terbatas.
Bekerja untukku.
Satu-satunya solusi HTML, di mana satu-satunya persyaratan adalah Anda tahu ukuran gambar yang Anda sisipkan. Tidak akan berfungsi untuk gambar transparan, karena digunakan background-image
sebagai pengisi.
Kita dapat berhasil menggunakan background-image
untuk menautkan gambar yang muncul jika gambar yang diberikan hilang. Maka satu-satunya masalah adalah gambar ikon yang rusak - kita dapat menghapusnya dengan memasukkan karakter kosong yang sangat besar, sehingga mendorong konten di luar tampilan 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
Solusi khusus CSS (khusus 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;
margin-bottom: -16px;
}
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
Tidak ada cara untuk memastikan banyaknya klien (browser) yang akan mencoba melihat halaman Anda. Salah satu aspek yang perlu dipertimbangkan adalah bahwa klien email adalah browser web yang tidak aktif dan mungkin tidak menangani tipuan seperti ini ...
Karena itu Anda juga harus menyertakan alt / teks dengan DEFAULT WIDTH dan HEIGHT, seperti ini. Ini adalah solusi HTML murni.
alt="NO IMAGE" width="800" height="350"
Jadi jawaban bagus lainnya akan sedikit dimodifikasi sebagai berikut:
<img src="foo.jpg" onerror="if (this.src != 'error.jpg') this.src = 'error.jpg';" alt="NO IMAGE" width="800" height="350">
Saya memiliki masalah dengan tag objek di Chrome, tetapi saya akan membayangkan ini juga berlaku untuk itu.
Anda dapat mendesain lebih lanjut alt / teks menjadi SANGAT BESAR ...
Jadi jawaban saya adalah menggunakan Javascript dengan fallback alt / teks yang bagus.
Saya juga menemukan ini menarik: Cara gaya atribut alt gambar
Versi modulable dengan JQuery , tambahkan ini di akhir file Anda:
<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>
dan pada img
tag Anda :
<img src="..." data-src-error="..." />
Solusi di atas tidak lengkap , itu melewatkan atribut src
.
this.src
dan this.attribute('src')
TIDAK sama, yang pertama berisi referensi lengkap ke gambar, misalnya http://my.host/error.jpg
, tetapi atribut hanya menyimpan nilai aslinya,error.jpg
Solusi yang benar
<img src="foo.jpg" onerror="if (this.src != 'error.jpg' && this.attribute('src') != 'error.jpg') this.src = 'error.jpg';" />
Uncaught TypeError: this.attribute is not a function
di Chrome 43.
Jika Anda menggunakan Angular 1.x Anda dapat memasukkan arahan yang memungkinkan Anda untuk mundur ke sejumlah gambar. Atribut fallback mendukung satu url, beberapa url di dalam array, atau ekspresi sudut menggunakan data lingkup:
<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" />
Tambahkan arahan fallback baru ke modul aplikasi sudut Anda:
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);
});
}
};
}])
Saya baru-baru ini harus membangun sistem mundur yang mencakup sejumlah gambar mundur. Inilah cara saya melakukannya menggunakan fungsi JavaScript sederhana.
HTML
<img src="some_image.tiff"
onerror="fallBackImg(this);"
data-fallIndex="1"
data-fallback1="some_image.png"
data-fallback2="some_image.jpg">
JavaScript
function fallBackImg(elem){
elem.onerror = null;
let index = +elem.dataset.fallIndex;
elem.src = elem.dataset[`fallback${index}`];
index++;
elem.dataset.fallbackindex = index;
}
Saya merasa ini cara yang cukup ringan untuk menangani banyak gambar mundur.
Untuk gambar apa pun, cukup gunakan kode javascript ini:
if (ptImage.naturalWidth == 0)
ptImage.src = '../../../../icons/blank.png';
mana ptImage
adalah <img>
alamat tag diperoleh document.getElementById()
.
Google membuang halaman ini ke kata kunci "image fallback html", tetapi karena tidak ada yang membantu saya, dan saya sedang mencari "dukungan fallback svg untuk IE di bawah 9", saya terus mencari dan inilah yang saya temukan:
<img src="base-image.svg" alt="picture" />
<!--[if (lte IE 8)|(!IE)]><image src="fallback-image.png" alt="picture" /><![endif]-->
Mungkin di luar topik, tetapi ini menyelesaikan masalah saya sendiri dan mungkin membantu orang lain juga.
Selain jawaban Patrick yang brilian, bagi Anda yang mencari solusi angular cross-platform js, inilah jawabannya:
<object type="image/png" data-ng-attr-data="{{ url || 'data:' }}">
<!-- any html as a fallback -->
</object>
Inilah bungkusan tempat saya bermain berusaha menemukan solusi yang tepat: http://plnkr.co/edit/nL6FQ6kMK33NJeW8DVDY?p=preview
Jika Anda telah membuat proyek Web dinamis dan telah menempatkan gambar yang diperlukan di WebContent maka Anda dapat mengakses gambar dengan menggunakan kode yang disebutkan di bawah ini di Spring MVC:
<img src="Refresh.png" alt="Refresh" height="50" width="50">
Anda juga dapat membuat folder bernama img dan menempatkan gambar di dalam folder img dan menempatkan folder img di dalam WebContent maka Anda dapat mengakses gambar dengan menggunakan kode yang disebutkan di bawah ini:
<img src="img/Refresh.png" alt="Refresh" height="50" width="50">
Baik!! Saya menemukan cara ini nyaman, periksa untuk atribut ketinggian gambar menjadi 0, maka Anda dapat menimpa atribut src dengan gambar default: https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/ Gambar
image.setAttribute('src','../icons/<some_image>.png');
//check the height attribute.. if image is available then by default it will
//be 100 else 0
if(image.height == 0){
image.setAttribute('src','../icons/default.png');
}