Як мовчки приховати піктограму «Зображення не знайдено», коли вихідне зображення 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.