Ввод изображения по умолчанию в случае, если атрибут src html <img>недопустим? - PullRequest
239 голосов
/ 11 июня 2009

Есть ли способ отобразить изображение по умолчанию в теге HTML <img>, если атрибут src недопустим (используется только HTML)? Если нет, то каким был бы ваш легкий способ обойти это?

Ответы [ 21 ]

4 голосов
/ 10 марта 2017

простой 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>
3 голосов
/ 26 января 2015

Приведенное выше решение неполно , оно пропустило атрибут 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';" />
3 голосов
/ 12 ноября 2015

Изменяемая версия с 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="..." />
2 голосов
/ 14 июня 2017

Если вы используете 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);
                });
            }
        };
    }])
0 голосов
/ 20 марта 2019

Простое и аккуратное решение, включающее несколько хороших ответов и комментариев.

<img src="foo.jpg" onerror="this.src='error.jpg';this.onerror='';">

Это даже решает риск бесконечного цикла.

работал для меня.

0 голосов
/ 12 марта 2019

Если вы создали динамический веб-проект и поместили требуемое изображение в 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 голосов
/ 19 апреля 2018

В дополнение к блестящему ответу Патрика для тех из вас, кто ищет кроссплатформенное угловое решение js, вот вам:

<object type="image/png" data-ng-attr-data="{{ url || 'data:' }}">
    <!-- any html as a fallback -->
</object>

Вот план, где я играл, пытаясь найти правильное решение: http://plnkr.co/edit/nL6FQ6kMK33NJeW8DVDY?p=preview

0 голосов
/ 07 февраля 2018

Хорошо !! Я нашел этот способ удобным, проверьте, чтобы атрибут высоты изображения был равен 0, тогда вы можете перезаписать атрибут src изображением по умолчанию: https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/Image

 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');
  }
0 голосов
/ 17 августа 2017

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]-->

Возможно, это не по теме, но это решило мою собственную проблему и могло бы помочь кому-то еще.

0 голосов
/ 11 июня 2009

Используя 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");
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...