Есть ли способ визуализации изображения по умолчанию в теге HTML <img>
, если атрибут src
недействителен (используя только HTML)? Если нет, какой будет ваш легкий способ обойти это?
Ввод изображения по умолчанию в случае, если атрибут src для html <img> недействителен?
Ответ 1
Вы запросили решение только для 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="Qaru logo and icons and such">
</object>
</p>
</body>
</html>
Ответ 2
Это хорошо работает для меня. Возможно, вы хотите использовать JQuery для подключения события.
<img src="foo.jpg" onerror="if (this.src != 'error.jpg') this.src = 'error.jpg';">
Обновлен с защитой ошибок jacquargs
Обновлено: только решение 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 { ...
Ответ 3
Нашел это решение в Spring в Action 3rd Ed.
<img src="../resources/images/Image1.jpg" onerror="this.src='../resources/images/none.jpg'" />
Update:
Это не только решение HTML... onerror
- это javascript
Ответ 4
<style type="text/css">
img {
background-image: url('/images/default.png')
}
</style>
Обязательно введите размеры изображения и хотите ли вы, чтобы изображение было черепицей или нет.
Ответ 5
Я не думаю, что это возможно, используя только HTML. Однако использование javascript должно быть выполнимым. Bassicly мы прокручиваем каждое изображение, проверяем, если оно завершено, и если оно naturalWidth равно нулю, значит, оно не найдено. Вот код:
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
Ответ 6
Если вы используете Angular/jQuery, это может помочь...
<img ng-src="{{item.url}}" altSrc="{{item.alt_url}}" onerror="this.src = $(this).attr('altSrc')">
Объяснение
Предполагая, что item
имеет свойство url
, которое может быть нулевым, тогда оно будет отображаться как сломанное. Это вызывает выполнение выражения атрибута onerror
, как описано выше. Вам необходимо переопределить атрибут src
, как описано выше, но вам понадобится jQuery для доступа к вашему altSrc. Не удалось заставить его работать с ванильным JavaScript.
Может показаться немного взломанным, но сохранил день в моем проекте.
Ответ 7
<img style="background-image: url(image1), url(image2);"></img>
Ответ 8
Решение только для 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
Ответ 9
простой img-элемент не очень гибкий, поэтому я объединил его с элементом изображения. таким образом, CSS не нужен. при возникновении ошибки все srcset устанавливаются в резервную версию. изображение с неработающей связью не отображается. он не загружает ненужные версии изображений. элемент изображения поддерживает гибкий дизайн и множественные резервные копии для типов, которые не поддерживаются браузером.
<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>
Ответ 10
angular2:
<img src="{{foo.url}}" onerror="this.src='path/to/altimg.png'">
Ответ 11
Невозможно убедиться в множестве клиентов (браузеров), которые будут пытаться просмотреть вашу страницу. Один аспект, который следует учитывать, заключается в том, что почтовые клиенты являются defacto веб-браузерами и не могут обрабатывать такие trickamajickery...
Как таковой, вы также должны включать alt/text с WEFATH DEFAULT и 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">
У меня были проблемы с тегом object в Chrome, но я бы предположил, что это применимо и к этому.
Вы можете еще больше стилизовать alt/text, чтобы быть ОЧЕНЬ БОЛЬШОЙ...
Итак, мой ответ - использовать Javascript с приятным резервом alt/text.
Я также нашел это интересным: Как создать атрибут alt образа
Ответ 12
Вышеупомянутое решение неполное, оно пропустило атрибут 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';" />
Ответ 13
Модируемая версия с 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="..." />
Ответ 14
Если вы используете Angular 1.x, вы можете включить директиву, которая позволит вам отказаться от любого количества изображений. Атрибут fallback поддерживает один URL-адрес, несколько URL-адресов внутри массива или выражение Angular, используя данные области:
<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:
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);
});
}
};
}])
Ответ 15
Простое и аккуратное решение, включающее несколько хороших ответов и комментариев.
<img src="foo.jpg" onerror="this.src='error.jpg';this.onerror='';">
Это даже решает риск бесконечной циклы.
Работал на меня.
Ответ 16
Используя JQuery, вы можете сделать что-то вроде этого:
$(document).ready(function() {
if ($("img").attr("src") != null)
{
if ($("img").attr("src").toString() == "")
{
$("img").attr("src", "images/default.jpg");
}
}
else
{
$("img").attr("src", "images/default.jpg");
}
});
Ответ 17
Для любого изображения просто используйте этот код javascript:
if (ptImage.naturalWidth == 0)
ptImage.src = '../../../../icons/blank.png';
где ptImage
- это адрес тега <img>
, полученный document.getElementById()
.
Ответ 18
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]-->
Это может быть не по теме, но оно разрешило мою собственную проблему, и это может помочь кому-то еще.
Ответ 19
В дополнение к блестящему ответу Патрика, для тех из вас, кто ищет кроссплатформенное угловое решение js, здесь вы идете:
<object type="image/png" data-ng-attr-data="{{ url || 'data:' }}">
<!-- any html as a fallback -->
</object>
Вот план, где я играл, пытаясь найти правильное решение: http://plnkr.co/edit/nL6FQ6kMK33NJeW8DVDY?p=preview
Ответ 20
Если вы создали динамический веб-проект и поместили требуемое изображение в 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">
Ответ 21
Что ж!! Я нашел этот способ удобным, проверьте, что атрибут высоты изображения равен 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');
}