Memasukkan gambar default seandainya atribut src dari html <img> tidak valid?
268
Apakah ada cara untuk membuat gambar default dalam <img>tag HTML , jika srcatributnya tidak valid (hanya menggunakan HTML)? Jika tidak, apa cara ringan Anda untuk mengatasinya?
HTML tidak memiliki cadangan untuk gambar yang rusak. Anda harus menggunakan JavaScript untuk menemukan gambar yang rusak dan mengubah atribut src mereka.
Blixt
2
@Blixt - Bagaimana jika klien Anda adalah MS Outlook atau pembaca EMAIL lainnya dan Anda tidak memiliki Javascript, dan opsi objek tidak berfungsi ... Saya kira satu-satunya solusi adalah alt / teks
Xofo
Jawaban:
319
Anda meminta solusi hanya HTML ...
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"><htmllang="en"><head><title>Object Test</title><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"></head><body><p><objectdata="http://stackoverflow.com/does-not-exist.png"type="image/png"><imgsrc="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 imgtag 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.
Ini bekerja untuk saya di IE8 setelah saya memasukkan DTD untuk HTML 4.01.
Patrick McElhaney
Ini tidak berfungsi jika gambar yang tidak ada telah X-Frame-Optionsdiatur ke SAMEORIGINatau pengaturan yang lebih permisif.
Attila O.
Ini berfungsi tetapi jika tautan di object.data tidak tepercaya, ia dapat memuat semua jenis barang ...
Michael_Scharf
1
Elemen 'img' tidak dapat disarangkan di dalam elemen 'objek'.
Matheus Miranda
2
@Matheus Tentu bisa. Dalam objek HTML4 dapat berisi konten mengalir (hampir semuanya, termasuk img), dan dalam HTML5 itu transparan, artinya dapat berisi HTML5 yang valid.
Patrick McElhaney
318
Ini bekerja dengan baik untuk saya. Mungkin Anda ingin menggunakan JQuery untuk mengaitkan acara.
Diperbarui: solusi CSS saja.
Baru-baru ini saya melihat Vitaly Friedman mendemokan solusi CSS hebat yang tidak saya sadari. Idenya adalah untuk menerapkan contentproperti ke gambar yang rusak. Biasanya :afteratau :beforetidak berlaku untuk gambar, tetapi ketika mereka rusak, mereka diterapkan.
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 { ...
BTW, jika error.jpg tidak ada, ini menyebabkan loop tak terbatas karena terus berusaha menemukan gambar, kemudian onError dipanggil lagi, tidak dapat menemukannya, dan semuanya dimulai lagi.
borq
30
Untuk menghindari risiko loop tak terbatas, tambahkan saja tes: <img src = "foo.jpg" onerror = "if (this.src! = 'Error.jog') this.src = 'error.jpg';">
jacquarg
21
Atau, Anda dapat menulis:onerror="this.src='error.jpg';this.onerror='';"
Ini sangat bagus. Berikut ini adalah pembaruan dengan gambar mundur pada imgur: <img src = "a-missing-image.jpg" alt = "" onerror = "this.src = 'http: ///i.imgur.com/hfM1J8s.png' ">
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
Ini hanya berfungsi jika image1 benar-benar buram. Jika memiliki transparansi, seperti yang dilakukan sebagian besar ikon gambar, maka image2 akan muncul.
Tidak sebagian besar browser menampilkan gambar 'tautan rusak' saat gambar tidak ditemukan ... Jika demikian, pengaturan latar belakang tidak akan menyelesaikan masalah.
Justin D.
13
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;}}}
Dengan asumsi bahwa itemmemiliki properti urlyang mungkin nol, ketika itu maka gambar akan ditampilkan sebagai rusak. Itu memicu eksekusi onerrorekspresi atribut, seperti dijelaskan di atas. Anda perlu mengganti srcatribut 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.
ini hebat! Waspadai dukungan browser yang hilang caniuse.com/#feat=picture . pertimbangkan untuk menggunakan polyfill atau solusi lain jika Anda perlu mendukung browser lama seperti IE11.
Meskipun ini mungkin berhasil, saya tidak berpikir itu menambahkan informasi baru. Bagian onerror hanyalah JavaScript vanilla dan pengikatan src seharusnya sudah diketahui oleh pengguna Angular
Chic
7
Solusi sederhana dan rapi yang melibatkan beberapa jawaban dan komentar yang baik.
Tidak, aku juga tidak akan bilang itu rapi. Belum lagi bahwa ini mungkin pengulangan solusi lain.
Script47
Bekerja seperti pesona! Terima kasih!
Goehybrid
1
Penyelamat. Saya tidak ingin elegan, saya ingin sederhana dan bekerja. Terima kasih!
Kit
7
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-imagesebagai pengisi.
Kita dapat berhasil menggunakan background-imageuntuk 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.
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:
Solusi di atas tidak lengkap , itu melewatkan atribut src.
this.srcdan 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
Saat menggunakan kode ini, saya melihat Uncaught TypeError: this.attribute is not a functiondi Chrome 43.
John Washam
Apakah Anda menggunakan jQuery?
mix3d
onError tidak berlaku lagi menurut developer.mozilla.org/en-US/docs/Web/HTML/Element/img
comiventor
2
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:
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;}elseif(typeof expressionResult ==='object'&& expressionResult instanceofArray){// 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);});}};}])
Ide keren! Array dari gambar fallback adalah implementasi yang baik
Z. Khullah
1
Saya baru-baru ini harus membangun sistem mundur yang mencakup sejumlah gambar mundur. Inilah cara saya melakukannya menggunakan fungsi JavaScript sederhana.
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:
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:
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:
image.setAttribute('src','../icons/<some_image>.png');//check the height attribute.. if image is available then by default it will //be 100 else 0if(image.height ==0){
image.setAttribute('src','../icons/default.png');}
Jawaban:
Anda meminta solusi hanya 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 menggunakanimg
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.
sumber
X-Frame-Options
diatur keSAMEORIGIN
atau pengaturan yang lebih permisif.Ini bekerja dengan baik untuk saya. Mungkin Anda ingin menggunakan JQuery untuk mengaitkan acara.
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.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 { ...
sumber
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 javascriptsumber
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
sumber
Pastikan untuk memasukkan dimensi gambar dan apakah Anda ingin gambar untuk ubin atau tidak.
sumber
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:
Gunakan seperti ini:
Diuji di Chrome dan Firefox
sumber
Jika Anda menggunakan Angular / jQuery maka ini mungkin membantu ...
Penjelasan
Dengan asumsi bahwa
item
memiliki propertiurl
yang mungkin nol, ketika itu maka gambar akan ditampilkan sebagai rusak. Itu memicu eksekusionerror
ekspresi atribut, seperti dijelaskan di atas. Anda perlu menggantisrc
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.
sumber
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.
sumber
angular2:
sumber
Solusi sederhana dan rapi yang melibatkan beberapa jawaban dan komentar yang baik.
Bahkan memecahkan risiko loop tak terbatas.
Bekerja untukku.
sumber
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 tampilanimg
.Solusi khusus CSS (khusus Webkit)
sumber
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.
Jadi jawaban bagus lainnya akan sedikit dimodifikasi sebagai berikut:
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
sumber
Versi modulable dengan JQuery , tambahkan ini di akhir file Anda:
dan pada
img
tag Anda :sumber
Solusi di atas tidak lengkap , itu melewatkan atribut
src
.this.src
danthis.attribute('src')
TIDAK sama, yang pertama berisi referensi lengkap ke gambar, misalnyahttp://my.host/error.jpg
, tetapi atribut hanya menyimpan nilai aslinya,error.jpg
Solusi yang benar
sumber
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:
Tambahkan arahan fallback baru ke modul aplikasi sudut Anda:
sumber
Saya baru-baru ini harus membangun sistem mundur yang mencakup sejumlah gambar mundur. Inilah cara saya melakukannya menggunakan fungsi JavaScript sederhana.
HTML
JavaScript
Saya merasa ini cara yang cukup ringan untuk menangani banyak gambar mundur.
sumber
Menggunakan Jquery Anda bisa melakukan sesuatu seperti ini:
sumber
Untuk gambar apa pun, cukup gunakan kode javascript ini:
mana
ptImage
adalah<img>
alamat tag diperolehdocument.getElementById()
.sumber
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:
Mungkin di luar topik, tetapi ini menyelesaikan masalah saya sendiri dan mungkin membantu orang lain juga.
sumber
Selain jawaban Patrick yang brilian, bagi Anda yang mencari solusi angular cross-platform js, inilah jawabannya:
Inilah bungkusan tempat saya bermain berusaha menemukan solusi yang tepat: http://plnkr.co/edit/nL6FQ6kMK33NJeW8DVDY?p=preview
sumber
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:
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:
sumber
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
sumber