Як мовчки приховати піктограму «Зображення не знайдено», коли вихідне зображення src не знайдено


91

Чи знаєте ви, як приховати класичну піктограму "Зображення не знайдено" із відображеної HTML-сторінки, коли файл зображення не знайдений?

Будь-який робочий метод із використанням JavaScript / jQuery / CSS?


Відповідь Енді правильна, однак, ви можете замість цього використовувати style.vsibility. Якщо ви встановите видимість, елемент все ще зберігає свій простір у вашому документі, таким чином, ніяких смішних рухів документа.
— Крістіан

Я не бачу сенсу. Ви просто не повинні намагатися отримати доступ до існуючих джерел з вашого HTML-коду. Використання javascript для приховування неправомірних ресурсів здається мені потворним рішенням.
— Борис Делормас

1
@Kaaviar Ви втрачаєте суть. Тут є багато зображень із гарячими посиланнями, зламаних тут, у Stack Overflow через те, що зображення можуть бути доступні під час публікації, але недоступні через кілька місяців. Ці зображення мовчки і ніжно приховані.
— systempuntoout

1
@systempuntoout: Я не впевнений, чому до них по-різному ставляться. Я протестував зламане зображення у Firefox та Chrome, воно не відображається у Firefox, але воно відображається як зламане у Chrome. Зрозуміло, що це те, що Firefox вирішує самостійно, оскільки, схоже, жоден стиль не впливає на нього. До речі, велика робота над StackPrinter.
— Andy E

2
@systempuntoout: Я дізнався трохи більше інформації про те, як Firefox працює з цим. Дивіться оновлену скрипту та [власний псевдо-клас, :-moz-broken] ( developer.mozilla.org/en/CSS/:-moz-broken ). Я просто думав собі раніше, що псевдо-клас буде корисним для стилізації зламаних зображень.
— Andy E

Відповіді:


102

Ви можете використовувати onerrorподію в JavaScript, щоб діяти, коли зображення не вдається завантажити:

var img = document.getElementById("myImg");
img.onerror = function () { 
    this.style.display = "none";
}

У jQuery (з вашого запитання):

$("#myImg").error(function () { 
    $(this).hide(); 
});

Або для всіх зображень:

$("img").error(function () { 
    $(this).hide();
    // or $(this).css({visibility:"hidden"}); 
});

Вам слід використовувати visibility: hiddenзамість того, .hide()якщо приховування зображень може змінити макет. Багато веб-сайтів використовують натомість зображення "без зображення" за замовчуванням, вказуючи srcатрибут на це зображення, коли вказане розташування зображення недоступне.


1
andy - яке було б "глобальне" рішення застосувати до ВСІХ зображень ?? я думаю, це було б досить легко, якби всі вони були в одному div - просто дивувались ВСІМ образам у документі ...
— jim tollan

@jAndy: Я був упевнений, що це так, але ваш коментар змусив мене перевірити. Google швидко повернув цю сторінку w3schools (вибачте, Девід, якщо ви читаєте це) із зазначенням підтримки між браузерами.
— Andy E,

2
@jim: Якщо ви використовуєте jQuery, ви можете застосувати подію до всіх зображень. просто використовуйте селектор тегів, наприклад $("img").error(function () { /*...*/ });.
— Andy E,

@Andy E: звучить добре, +1. наступним цікавим питанням буде, " error" обмежується " " live()чи delegate().
— jAndy

3
visibilityбуло б краще, оскільки displayможе порушити макет.
— gblazex

114
<img onerror='this.style.display = "none"'>

На жаль, я не можу використовувати це рішення, оскільки вміст html завантажується зі стороннього веб-сайту через Json, і я не можу його редагувати. Все одно, дякую.
— systempuntoout

9
Чудово, саме те, що мені потрібно було. Простий і безперешкодний, він вміщується в шаблон!
— Макс.

Хоча вже досить старий, це чудово! Чи є спосіб приховати теги <a>, що оточують і моє тепер приховане зображення?
— SJDS

9

Я трохи змінив рішення, запропоноване Гері Віллоубі, оскільки воно коротко показує піктограму зламаного зображення. Моє рішення:

    <img src="..." style="display: none" onload="this.style.display=''">

У моєму рішенні зображення спочатку приховане і відображається лише тоді, коли його успішно завантажено. Він має недолік: користувачі не бачитимуть напівзавантажених зображень. І якщо користувач вимкнув JS, він ніколи не побачить жодних зображень


1
... і користувачі нічого не побачать, якщо javascript відключено!
— yckart

4
@yckart Ну, якщо у користувачів вимкнено javascript, найкорисніші веб-програми все одно не працюватимуть ...
— благоговіння

<img src="..." onerror="this.style.display = 'none'"/>може працювати краще для напівзавантажених і не-js випадків браузера?

6

Щоб приховати кожну помилку зображення, просто додайте цей JavaScript внизу сторінки (безпосередньо перед закриваючим тегом body):

(function() {
    var allimgs = document.images;
    for (var i = 0; i < allimgs.length; i++) {
        allimgs[i].onerror = function() {
            this.style.visibility = "hidden"; // Other elements aren't affected. 
        }
    }
})();

Це мій кращий підхід, оскільки він майже гарантує, що події onerror будуть пов’язані до того, як зображення помиляться, і вам не потрібно додавати атрибути onerror до кожного тегу зображення. Не забудьте поставити цей код після всіх ваших тегів зображень, але перед будь-яким іншим javascript, що знаходиться в <body>, інакше блокування зовнішнього завантаження JS може спричинити виконання після помилки зображення.
— галатів

Цей працює для мене, поряд з порадами галатів, потрібно виконати цей JS перед тим, що може затримати його.
— Адамз

Це відповідає на вихідне питання, але це однобічний процес. Щоб зробити зображення, які згодом завантажуються знову, видимими, також додайте подію завантаження. allimgs [i] .onload = function () {this.style.visibility = "visible"; };
— TRT 1968

5

Можливо, трохи пізно відповісти, але ось моя спроба. Коли я зіткнувся з тією ж проблемою, я виправив це, використовуючи div розміру зображення та встановивши для цього div фонове зображення. Якщо зображення не знайдено, div стає прозорим, тому все робиться мовчки без коду Java-скрипта.


4

Проводячи швидке дослідження відповіді Енді Е , його неможливо live()зв'язати error.

// won't work (chrome 5)
$('img').live('error', function(){
     $(this).css('visibility', 'hidden');
});

Тож треба їхати як

$('<img/>', {
  src:    'http://www.notarget.com/fake.jpg',
  error:  function(e){
    $(this).css('visibility', 'hidden');
  }
}).appendTo(document.body);

безпосередньо прив'язуючи при error event handlerстворенні нового елемента.


2
+1, причиною цього є те, що подія onerror DOM не спливає. жити та делегувати роботу, розміщуючи обробник подій далі вгору по ієрархії DOM і фіксуючи подію, коли вона з’являється. Звичайно, розробники jQuery працювали над цим для деяких подій, таких як фокус та розмиття
— Andy E

@Andy E: Так, вони вже працювали навколо цього, можливо, не найгірша з ідей, щоб зробити подібне error. Звучить як nice to haveдля мене.
— jAndy

3

я знайшов чудовий метод, щоб зробити саме це, при цьому залишаючись функціональним при використанні ng-srcдирективи в Angular.js і тому подібному ...

<img
  ng-src="{{myCtrl.myImageUrlThatWillDynamicallyChange}}" 
  onerror="this.src='data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='"
  />

це в основному найкоротший прозорий GIF (як видно http://proger.i-forge.net/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82% D0% B5% D1% 80 / [20121112]% 20Найменший% 20прозорий% 20піксель.html )

звичайно, цей gif можна зберігати всередині якоїсь глобальної змінної, щоб він не псував шаблони.

<script>
  window.fallbackGif = "..."
</script>

і використовувати

<img
  ng-src="{{myCtrl.myImageUrlThatWillDynamicallyChange}}" 
  onerror="this.src=fallbackGif"
  />

тощо


0

Просто використовуйте простий css

.AdminImageHolder {
display: inline-block;
min-width: 100px;
max-width: 100px;
min-height: 100px;
max-height: 100px;
background: url(img/100x100.png) no-repeat;
border: 1px solid #ccc;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.