Есть ли способ отобразить изображение по умолчанию в <img>
теге HTML , если src
атрибут недействителен (используется только HTML)? Если нет, то каким был бы ваш легкий способ обойти это?
Есть ли способ отобразить изображение по умолчанию в <img>
теге HTML , если src
атрибут недействителен (используется только 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://cdn.sstatic.net/Img/unified/sprites.svg?v=e5e58ae7df45" alt="Stack Overflow logo and icons and such">
</object>
</p>
</body>
</html>
Поскольку первое изображение не существует, откроется запасной вариант (спрайты, используемые на этом веб-сайте *). И если вы используете действительно старый браузер, который не поддерживает object
, он будет игнорировать этот тег и использовать этот img
тег. Смотрите веб- сайт caniuse для совместимости. Этот элемент широко поддерживается всеми браузерами из IE6 +.
* Если URL-адрес изображения не изменился (снова), в этом случае вы, вероятно, увидите альтернативный текст.
X-Frame-Options
установлено значение SAMEORIGIN
более допустимого.
Это хорошо работает для меня. Может быть, вы хотите использовать JQuery для подключения события.
<img src="foo.jpg" onerror="if (this.src != 'error.jpg') this.src = 'error.jpg';">
Обновлено с помощью jacquargs error guard
Обновлено: решение только для CSS
Недавно я увидел демо Виталия Фридмана - отличное решение 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 { ...
onerror="this.src='error.jpg';this.onerror='';"
Нашел это решение в Spring in Action 3rd Ed.
<img src="../resources/images/Image1.jpg" onerror="this.src='../resources/images/none.jpg'" />
Обновление:
это не только решение HTML ... onerror
является JavaScript
<img style="background-image: url(image1), url(image2);"></img>
Используйте фоновое изображение, которое позволит вам добавить несколько изображений. Мой случай: изображение1 является основным изображением, оно будет получено из какого-то места (браузер выполняет запрос) изображение2 является локальным изображением по умолчанию, которое будет отображаться во время загрузки изображения1. Если image1 возвращает какую-либо ошибку, пользователь не увидит никаких изменений, и это будет понятно для пользователя.
<style type="text/css">
img {
background-image: url('/images/default.png')
}
</style>
Обязательно введите размеры изображения и укажите, хотите ли вы, чтобы изображение было мозаичным или нет.
Я не думаю, что это возможно, используя только HTML. Однако, используя JavaScript, это должно быть выполнимо. В основном мы перебираем каждое изображение, проверяем, завершено ли оно, и если его естественная ширина равна нулю, это означает, что оно не найдено Вот код:
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
него есть свойство, url
которое может быть нулевым, тогда оно будет отображаться как поврежденное. Это запускает выполнение onerror
выражения атрибута, как описано выше. Вам нужно переопределить src
атрибут, как описано выше, но вам понадобится jQuery для доступа к вашему altSrc. Не удалось заставить его работать с ванильным JavaScript.
Может показаться немного хакерским, но спас день на моем проекте.
простой img-элемент не очень гибкий, поэтому я объединил его с картинным элементом. Таким образом, CSS не требуется. при возникновении ошибки все srcset устанавливаются на резервную версию. изображение неработающей ссылки не отображается. он не загружает ненужные версии изображений. элемент picture поддерживает адаптивный дизайн и несколько вариантов отката для типов, которые не поддерживаются браузером.
<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'">
Простое и аккуратное решение, включающее несколько хороших ответов и комментариев.
<img src="foo.jpg" onerror="this.src='error.jpg';this.onerror='';">
Это даже решает риск бесконечной петли.
Работал на меня.
Решение только для 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;
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
Невозможно быть уверенным в бесчисленном количестве клиентов (браузеров), которые попытаются просмотреть вашу страницу. Одним из аспектов, который следует учитывать, является то, что почтовые клиенты являются дефактными веб-браузерами и могут не обрабатывать такие хитрые махинации ...
Таким образом, вы также должны включить alt / text с DEFAULT WIDTH и HEIGHT, как это. Это чисто 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, но я бы подумал, что это применимо и к этому.
Вы можете далее стилизовать alt / text, чтобы ОЧЕНЬ БОЛЬШОЙ ...
Поэтому мой ответ - использовать Javascript с хорошим отступлением от alt / text.
Я также нашел это интересным: как стилизовать атрибут alt изображения
Изменяемая версия с 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';" />
Uncaught TypeError: this.attribute is not a function
в Chrome 43.
Если вы используете 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.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);
});
}
};
}])
Недавно мне пришлось создать резервную систему, которая включала любое количество резервных изображений. Вот как я это сделал, используя простую функцию JavaScript.
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;
}
Я чувствую, что это довольно легкий способ обработки многих резервных изображений.
Для любого изображения, просто используйте этот код JavaScript:
if (ptImage.naturalWidth == 0)
ptImage.src = '../../../../icons/blank.png';
где ptImage
найти <img>
адрес тега получен document.getElementById()
.
Google выкинул эту страницу по ключевым словам «image fallback html», но поскольку мне не помогло ни одно из вышеперечисленного, и я искал «поддержку резервирования svg для IE ниже 9», я продолжил поиск, и вот что я нашел:
<img src="base-image.svg" alt="picture" />
<!--[if (lte IE 8)|(!IE)]><image src="fallback-image.png" alt="picture" /><![endif]-->
Это может быть не по теме, но это решило мою собственную проблему и могло бы помочь кому-то еще.
В дополнение к блестящему ответу Патрика , для тех из вас, кто ищет кроссплатформенное угловое js-решение, вот вам:
<object type="image/png" data-ng-attr-data="{{ url || 'data:' }}">
<!-- any html as a fallback -->
</object>
Вот план, где я играл, пытаясь найти правильное решение: http://plnkr.co/edit/nL6FQ6kMK33NJeW8DVDY?p=preview
Если вы создали динамический веб-проект и поместили требуемое изображение в 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">
Хорошо!! Я нашел этот способ удобным, проверьте, чтобы атрибут высоты изображения был равен 0, затем вы можете перезаписать атрибут src изображением по умолчанию: https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/ Образ
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');
}