Wprowadzanie domyślnego obrazu w przypadku, gdy atrybut src html <img> jest nieprawidłowy?
268
Czy jest jakiś sposób na renderowanie domyślnego obrazu w <img>znaczniku HTML na wypadek, gdyby srcatrybut był nieprawidłowy (używając tylko HTML)? Jeśli nie, jaki byłby twój lekki sposób na obejście tego?
HTML nie ma efektu zastępczego dla uszkodzonych obrazów. Musisz użyć JavaScript, aby znaleźć uszkodzone obrazy i zmienić ich atrybut src.
Blixt,
2
@Blixt - Co jeśli twój klient to MS Outlook lub inny czytnik EMAIL, a nie masz Javascript, a opcja obiektu nie działa ... Zakładam, że jedynym rozwiązaniem jest alt / text
Xofo
Odpowiedzi:
319
Poprosiłeś o rozwiązanie tylko 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>
Ponieważ pierwszy obraz nie istnieje, wyświetli się kreacja zastępcza (duszki używane na tej stronie *). A jeśli używasz naprawdę starej przeglądarki, która nie obsługuje object, zignoruje ten tag i użyje imgtagu. Zobacz stronę internetową caniuse dla kompatybilności. Ten element jest szeroko obsługiwany przez wszystkie przeglądarki z IE6 +.
* Chyba że adres URL obrazu zostanie zmieniony (ponownie), w takim przypadku prawdopodobnie zobaczysz tekst alternatywny.
Działa dla mnie w IE8 po tym, jak wstawiłem DTD dla HTML 4.01.
Patrick McElhaney
To nie działa, jeśli nieistniejący obraz ma X-Frame-Optionsustawione SAMEORIGINlub bardziej liberalne ustawienie.
Attila O.
Działa, ale jeśli link w obiekcie object.data nie jest zaufany, może załadować różne rzeczy ...
Michael_Scharf,
1
Element „img” nie może być zagnieżdżony w elemencie „object”.
Matheus Miranda
2
@ Matheus Pewnie, że może. W HTML4 obiekt może zawierać treść przepływu (prawie wszystko, w tym img), aw HTML5 jest przezroczysty, co oznacza, że może zawierać dowolny prawidłowy HTML5.
Patrick McElhaney
318
To działa dobrze dla mnie. Być może chcesz użyć JQuery do przechwycenia zdarzenia.
Zaktualizowany o zabezpieczenie przed błędami jacquargs
Zaktualizowano: tylko rozwiązanie CSS
Ostatnio widziałem demo Witalija Friedmana świetne rozwiązanie CSS, o którym nie wiedziałem. Chodzi o zastosowanie contentwłaściwości do uszkodzonego obrazu. Zwykle :afterlub :beforenie mają zastosowania do obrazów, ale gdy są uszkodzone, są stosowane.
Jak pokazuje skrzypce, sam zepsuty obraz nie jest usuwany, ale prawdopodobnie rozwiąże to problem w większości przypadków bez JS i plików CSS. Jeśli chcesz zastosować różne obrazy w różnych lokalizacjach, po prostu różnicuj za pomocą klasy:.my-special-case img:before { ...
BTW, jeśli błąd.jpg nie istnieje, powoduje to nieskończoną pętlę, ponieważ ciągle próbuje znaleźć obraz, a następnie onError jest wywoływany ponownie, nie może go znaleźć, a wszystko zaczyna się od nowa.
borq
30
Aby uniknąć ryzyka nieskończonej pętli, po prostu dodaj test: <img src = "foo.jpg" onerror = "if (this.src! = 'Error.jog') this.src = 'error.jpg';">
jacquarg
21
Możesz też napisać:onerror="this.src='error.jpg';this.onerror='';"
Denilson Sá Maia
6
Gdzie jest w tym jQuery?
Praveen Kumar Purushothaman
64
Znalazłem to rozwiązanie w Spring in Action 3rd Ed.
To działa świetnie. Oto aktualizacja z rezerwowym obrazem na imgur: <img src = "a-missing-image.jpg" alt = "" onerror = "this.src = 'http: ///i.imgur.com/hfM1J8s.png' ">
Użyj obrazu tła, który pozwala dodać wiele obrazów. Mój przypadek: obraz1 jest głównym obrazem, który otrzyma z jakiegoś miejsca (przeglądarka wykonuje żądanie) obraz2 jest domyślnym obrazem lokalnym wyświetlanym podczas ładowania obrazu1. Jeśli obraz 1 zwróci jakikolwiek błąd, użytkownik nie zobaczy żadnej zmiany i będzie to czyste dla wygody użytkownika
Czy większość przeglądarek nie wyświetla obrazu „zepsutego łącza”, gdy obraz nie został znaleziony ... W takim przypadku ustawienie tła nie rozwiązałoby problemu.
Justin D.,
13
Nie sądzę, że jest to możliwe przy użyciu samego HTML. Jednak przy użyciu javascript powinno to być wykonalne. Basowo zapętlamy każdy obraz, sprawdzamy, czy jest on kompletny, a jeśli jest naturalny Szerokość wynosi zero, to znaczy, że nie został znaleziony. Oto kod:
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;}}}
Zakładając, że itemma właściwość, urlktóra może mieć wartość NULL, wtedy jest ona wyświetlana jako uszkodzona. To powoduje wykonanie onerrorwyrażenia atrybutu, jak opisano powyżej. Musisz przesłonić srcatrybut, jak opisano powyżej, ale będziesz potrzebować jQuery, aby uzyskać dostęp do altSrc. Nie można go uruchomić z waniliowym JavaScript.
Może wydawać się trochę zrzędliwy, ale uratował mi dzień w moim projekcie.
prosty element img nie jest zbyt elastyczny, więc połączyłem go z elementem obrazu. w ten sposób nie jest potrzebny CSS. gdy wystąpi błąd, wszystkie srcset są ustawione na wersję rezerwową. uszkodzony link nie wyświetla się. nie ładuje niepotrzebnych wersji obrazu. element obrazu obsługuje responsywne projektowanie i liczne awarie dla typów, które nie są obsługiwane przez przeglądarkę.
ten jest świetny! pamiętaj o braku obsługi przeglądarki caniuse.com/#feat=picture . rozważ użycie wielopełniacza lub innego rozwiązania, jeśli potrzebujesz obsługi starszych przeglądarek, takich jak IE11.
Chociaż może to działać, nie sądzę, aby dodawało to nowe informacje. Część onerror to po prostu waniliowy JavaScript, a powiązanie src powinno już być znane użytkownikom Angular
Chic
7
Proste i schludne rozwiązanie obejmujące kilka dobrych odpowiedzi i komentarzy.
Nie, nie powiedziałbym też, że jest fajnie. Nie wspominając już o tym, że jest to prawdopodobnie powtórka innych rozwiązań.
Script47
Działa jak marzenie! Dziękuję Ci!
Goehybrid,
1
Ratownik. Nie chciałem eleganckiego, chciałem prosty i działający. Dzięki!
Kit
7
Rozwiązanie tylko w języku HTML, w którym jedynym wymaganiem jest znajomość rozmiaru wstawianego obrazu. Nie działa w przypadku przezroczystych obrazów, ponieważ wykorzystuje się go background-imagejako wypełniacz.
Możemy z powodzeniem użyć background-imagedo połączenia obrazu, który pojawia się, jeśli brakuje danego obrazu. Wtedy jedynym problemem jest zepsuty obraz ikony - możemy go usunąć, wstawiając bardzo duży pusty znak, a tym samym wypychając zawartość poza ekran img.
Nie ma sposobu, aby upewnić się, że niezliczona liczba klientów (przeglądarek), które spróbują wyświetlić Twoją stronę. Jednym z aspektów, które należy wziąć pod uwagę, jest to, że klienci poczty e-mail są defaktami przeglądarek internetowych i mogą nie obsługiwać takich sztuczek ...
Jako taki, powinieneś także dołączyć alt / text z DOMYŚLNĄ SZEROKOŚCIĄ i WYSOKOŚCIĄ, w ten sposób. To jest czyste rozwiązanie HTML.
alt="NO IMAGE" width="800" height="350"
Tak więc inna dobra odpowiedź zostałaby nieco zmodyfikowana w następujący sposób:
Powyższe rozwiązanie jest niekompletne , brakowało atrybutu src.
this.srci this.attribute('src')NIE są takie same, pierwszy zawiera na przykład pełne odniesienie do obrazu http://my.host/error.jpg, ale atrybut zachowuje oryginalną wartość,error.jpg
Gdy używam tego kodu, widzę Uncaught TypeError: this.attribute is not a functionw Chrome 43.
John Washam
Czy używasz jQuery?
mix3d
onError jest przestarzałe jak na developer.mozilla.org/en-US/docs/Web/HTML/Element/img
komentator
2
Jeśli używasz Angulara 1.x, możesz dołączyć dyrektywę, która pozwoli ci wrócić do dowolnej liczby obrazów. Atrybut rezerwowy obsługuje pojedynczy adres URL, wiele adresów URL w tablicy lub wyrażenie kątowe przy użyciu danych zakresu:
Dodaj nową dyrektywę zastępczą do modułu aplikacji kątowej:
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);});}};}])
Fajny pomysł! Tablica z rezerwowych obrazów jest dobrą implementacją
Z. Khullah
1
Niedawno musiałem zbudować system rezerwowy, który obejmował dowolną liczbę obrazów rezerwowych. Oto jak to zrobiłem za pomocą prostej funkcji JavaScript.
Google wyrzuciło tę stronę do słów kluczowych „obraz zastępczy html”, ale ponieważ nie powyższe pomogło mi, i szukałem „wsparcia zastępczego svg dla IE poniżej 9”, szukałem dalej i oto, co znalazłem:
Jeśli utworzyłeś dynamiczny projekt internetowy i umieściłeś wymagany obraz w WebContent, możesz uzyskać dostęp do obrazu przy użyciu niżej wymienionego kodu w Spring MVC:
Możesz również utworzyć folder o nazwie img i umieścić obraz w folderze img i umieścić ten folder img w WebContent, a następnie możesz uzyskać dostęp do obrazu za pomocą poniższego kodu:
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');}
Odpowiedzi:
Poprosiłeś o rozwiązanie tylko HTML ...
Ponieważ pierwszy obraz nie istnieje, wyświetli się kreacja zastępcza (duszki używane na tej stronie *). A jeśli używasz naprawdę starej przeglądarki, która nie obsługuje
object
, zignoruje ten tag i użyjeimg
tagu. Zobacz stronę internetową caniuse dla kompatybilności. Ten element jest szeroko obsługiwany przez wszystkie przeglądarki z IE6 +.* Chyba że adres URL obrazu zostanie zmieniony (ponownie), w takim przypadku prawdopodobnie zobaczysz tekst alternatywny.
źródło
X-Frame-Options
ustawioneSAMEORIGIN
lub bardziej liberalne ustawienie.To działa dobrze dla mnie. Być może chcesz użyć JQuery do przechwycenia zdarzenia.
Zaktualizowany o zabezpieczenie przed błędami jacquargs
Zaktualizowano: tylko rozwiązanie CSS Ostatnio widziałem demo Witalija Friedmana świetne rozwiązanie CSS, o którym nie wiedziałem. Chodzi o zastosowanie
content
właściwości do uszkodzonego obrazu. Zwykle:after
lub:before
nie mają zastosowania do obrazów, ale gdy są uszkodzone, są stosowane.Demo: https://jsfiddle.net/uz2gmh2k/2/
Jak pokazuje skrzypce, sam zepsuty obraz nie jest usuwany, ale prawdopodobnie rozwiąże to problem w większości przypadków bez JS i plików CSS. Jeśli chcesz zastosować różne obrazy w różnych lokalizacjach, po prostu różnicuj za pomocą klasy:
.my-special-case img:before { ...
źródło
onerror="this.src='error.jpg';this.onerror='';"
Znalazłem to rozwiązanie w Spring in Action 3rd Ed.
<img src="../resources/images/Image1.jpg" onerror="this.src='../resources/images/none.jpg'" />
Aktualizacja: To nie jest tylko rozwiązanie HTML ...
onerror
to javascriptźródło
Użyj obrazu tła, który pozwala dodać wiele obrazów. Mój przypadek: obraz1 jest głównym obrazem, który otrzyma z jakiegoś miejsca (przeglądarka wykonuje żądanie) obraz2 jest domyślnym obrazem lokalnym wyświetlanym podczas ładowania obrazu1. Jeśli obraz 1 zwróci jakikolwiek błąd, użytkownik nie zobaczy żadnej zmiany i będzie to czyste dla wygody użytkownika
źródło
Pamiętaj o wprowadzeniu wymiarów obrazu i określ, czy obraz ma być kafelkowy, czy nie.
źródło
Nie sądzę, że jest to możliwe przy użyciu samego HTML. Jednak przy użyciu javascript powinno to być wykonalne. Basowo zapętlamy każdy obraz, sprawdzamy, czy jest on kompletny, a jeśli jest naturalny Szerokość wynosi zero, to znaczy, że nie został znaleziony. Oto kod:
Użyj tego w ten sposób:
Testowane w Chrome i Firefox
źródło
Jeśli używasz Angular / jQuery, może to pomóc ...
Wyjaśnienie
Zakładając, że
item
ma właściwość,url
która może mieć wartość NULL, wtedy jest ona wyświetlana jako uszkodzona. To powoduje wykonanieonerror
wyrażenia atrybutu, jak opisano powyżej. Musisz przesłonićsrc
atrybut, jak opisano powyżej, ale będziesz potrzebować jQuery, aby uzyskać dostęp do altSrc. Nie można go uruchomić z waniliowym JavaScript.Może wydawać się trochę zrzędliwy, ale uratował mi dzień w moim projekcie.
źródło
prosty element img nie jest zbyt elastyczny, więc połączyłem go z elementem obrazu. w ten sposób nie jest potrzebny CSS. gdy wystąpi błąd, wszystkie srcset są ustawione na wersję rezerwową. uszkodzony link nie wyświetla się. nie ładuje niepotrzebnych wersji obrazu. element obrazu obsługuje responsywne projektowanie i liczne awarie dla typów, które nie są obsługiwane przez przeglądarkę.
źródło
angular2:
źródło
Proste i schludne rozwiązanie obejmujące kilka dobrych odpowiedzi i komentarzy.
Rozwiązuje nawet ryzyko nieskończonej pętli.
Pracował dla mnie.
źródło
Rozwiązanie tylko w języku HTML, w którym jedynym wymaganiem jest znajomość rozmiaru wstawianego obrazu. Nie działa w przypadku przezroczystych obrazów, ponieważ wykorzystuje się go
background-image
jako wypełniacz.Możemy z powodzeniem użyć
background-image
do połączenia obrazu, który pojawia się, jeśli brakuje danego obrazu. Wtedy jedynym problemem jest zepsuty obraz ikony - możemy go usunąć, wstawiając bardzo duży pusty znak, a tym samym wypychając zawartość poza ekranimg
.Rozwiązanie tylko CSS (tylko Webkit)
źródło
Nie ma sposobu, aby upewnić się, że niezliczona liczba klientów (przeglądarek), które spróbują wyświetlić Twoją stronę. Jednym z aspektów, które należy wziąć pod uwagę, jest to, że klienci poczty e-mail są defaktami przeglądarek internetowych i mogą nie obsługiwać takich sztuczek ...
Jako taki, powinieneś także dołączyć alt / text z DOMYŚLNĄ SZEROKOŚCIĄ i WYSOKOŚCIĄ, w ten sposób. To jest czyste rozwiązanie HTML.
Tak więc inna dobra odpowiedź zostałaby nieco zmodyfikowana w następujący sposób:
Miałem problemy z tagiem obiektu w Chrome, ale wyobrażam sobie, że to dotyczy również tego.
Możesz dodatkowo stylizować alt / tekst, aby był BARDZO WIELKI ...
Tak więc moją odpowiedzią jest użycie Javascript z ładnym odwróceniem tekstu alt / text.
Dla mnie też było interesujące: Jak stylizować atrybut alt obrazu
źródło
Modulowana wersja z JQuery , dodaj to na końcu pliku:
i na twoim
img
tagu:źródło
Powyższe rozwiązanie jest niekompletne , brakowało atrybutu
src
.this.src
ithis.attribute('src')
NIE są takie same, pierwszy zawiera na przykład pełne odniesienie do obrazuhttp://my.host/error.jpg
, ale atrybut zachowuje oryginalną wartość,error.jpg
Prawidłowe rozwiązanie
źródło
Uncaught TypeError: this.attribute is not a function
w Chrome 43.Jeśli używasz Angulara 1.x, możesz dołączyć dyrektywę, która pozwoli ci wrócić do dowolnej liczby obrazów. Atrybut rezerwowy obsługuje pojedynczy adres URL, wiele adresów URL w tablicy lub wyrażenie kątowe przy użyciu danych zakresu:
Dodaj nową dyrektywę zastępczą do modułu aplikacji kątowej:
źródło
Niedawno musiałem zbudować system rezerwowy, który obejmował dowolną liczbę obrazów rezerwowych. Oto jak to zrobiłem za pomocą prostej funkcji JavaScript.
HTML
JavaScript
Wydaje mi się, że jest to dość lekki sposób radzenia sobie z wieloma obrazami zastępczymi.
źródło
Za pomocą Jquery możesz zrobić coś takiego:
źródło
W przypadku dowolnego obrazu użyj tego kodu javascript:
gdzie
ptImage
jest<img>
adres tagu uzyskany przezdocument.getElementById()
.źródło
Google wyrzuciło tę stronę do słów kluczowych „obraz zastępczy html”, ale ponieważ nie powyższe pomogło mi, i szukałem „wsparcia zastępczego svg dla IE poniżej 9”, szukałem dalej i oto, co znalazłem:
To może być nie na temat, ale rozwiązało mój własny problem i może pomóc komuś innemu.
źródło
Oprócz genialnej odpowiedzi Patricka , dla tych z was, którzy szukają międzyplatformowego rozwiązania kątowego js, proszę:
Oto problem, w którym grałem, próbując znaleźć właściwe rozwiązanie: http://plnkr.co/edit/nL6FQ6kMK33NJeW8DVDY?p=preview
źródło
Jeśli utworzyłeś dynamiczny projekt internetowy i umieściłeś wymagany obraz w WebContent, możesz uzyskać dostęp do obrazu przy użyciu niżej wymienionego kodu w Spring MVC:
Możesz również utworzyć folder o nazwie img i umieścić obraz w folderze img i umieścić ten folder img w WebContent, a następnie możesz uzyskać dostęp do obrazu za pomocą poniższego kodu:
źródło
Dobrze!! Uznałem to za wygodne, sprawdź, czy atrybut wysokości obrazu ma wartość 0, a następnie możesz zastąpić atrybut src domyślnym obrazem: https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/ Wizerunek
źródło