Лучший способ объяснить эту простую тему - дать простой пример и ссылку ссылки: -
В следующем примере у нас есть два переключателя. Если пользователь выбирает какой-либо радиокнопку, мы отобразим выбранное значение переключателя в окне предупреждения.
blockquote>Html:
<form id="Demo"> <input type="radio" name="Gender" value="Male" /> Male <br /> <input type="radio" name="Gender" value="Female" /> Female<br /> <input type="radio" name="Gender" value="others" /> others <br /> </form>
jquery: -
$(document).ready(function(){ $('#Demo input').on('change', function() { alert($('input[name="Gender"]:checked', '#Demo').val()); }); });
Обработать событие onError
, чтобы изображение переназначало его источник с помощью JavaScript:
function imgError(image) {
image.onerror = "";
image.src = "/images/noimage.gif";
return true;
}
<img src="image.png" onerror="imgError(this);"/>
Или без функции JavaScript:
<img src="image.png" onError="this.onerror=null;this.src='/images/noimage.gif';" />
Следующие В таблице совместимости перечислены браузеры, поддерживающие средство ошибки:
В случае, если кто-то вроде меня, пытается присоединить событие error
к динамическому тегу HTML img
, я хотел бы указать, что есть catch:
По-видимому img
ошибки не вызывают пузырь в большинстве браузеров, вопреки тому, что говорит стандарт .
Итак, что-то вроде следующего не будет работать:
$(document).on('error', 'img', function () { ... })
Надеюсь, это будет полезно кому-то другому. Хотелось бы, чтобы я видел это здесь в этой теме. Но я этого не сделал. Итак, я добавляю его
Это JavaScript, должен быть совместим с перекрестным браузером и поставляет без уродливой разметки onerror=""
:
var sPathToDefaultImg = 'http://cdn.sstatic.net/stackexchange/img/logos/so/so-icon.png',
validateImage = function( domImg ) {
oImg = new Image();
oImg.onerror = function() {
domImg.src = sPathToDefaultImg;
};
oImg.src = domImg.src;
},
aImg = document.getElementsByTagName( 'IMG' ),
i = aImg.length;
while ( i-- ) {
validateImage( aImg[i] );
}
Вы можете использовать собственную выборку GitHub для этого:
Frontend: https://github.com/github/fetch или для Backend, версия Node.js: https://github.com/bitinn/node-fetch
fetch(url)
.then(function(res) {
if (res.status == '200') {
return image;
} else {
return placeholder;
}
}
Изменить: этот метод заменит XHR и предположительно уже был в Chrome. Для тех, кто читает это в будущем, вам может не понадобиться упомянутая выше библиотека.
Если изображение не может быть загружено (например, поскольку оно отсутствует в указанном URL-адресе), URL-адрес изображения будет изменен на значение по умолчанию,
Подробнее о .error ()
$('img').on('error', function (e) {
$(this).attr('src', 'broken.png');
});
Я использую приведенный ниже код, который сначала пытается найти аватар текущего пользователя на основе их идентификатора пользователя, который в этом случае равен «123», и если он не находит изображение аватара, код onerror изменяет img src на placeholder изображение.
<img src="avatars/users/123.png" onerror="this.src='/ngTribeBase/src/assets/img/avatars/male.png'" />
this.onerror=null;
, который предотвращает бесконечный цикл, если ваш альт-образ также будет нарушен.
– RozzA
22 November 2015 в 06:19
Я нашел этот пост, глядя на эту другую SO-почту . Ниже приведен экземпляр ответа, который я дал там.
Я знаю, что это старый поток, но React стал популярным, и, возможно, кто-то, кто использует React, придет сюда искать ответ на ту же проблему.
Итак, если вы используете React, вы можете сделать что-то вроде ниже, что было ответом, предоставленным Бен Алпертом команды React здесь
getInitialState: function(event) {
return {image: "http://example.com/primary_image.jpg"};
},
handleError: function(event) {
this.setState({image: "http://example.com/failover_image.jpg"});
},
render: function() {
return (
<img onError={this.handleError} src={src} />;
);
}
У меня такая же проблема. Этот код хорошо работает в моем случае.
// Replace broken images by a default img
$('img').each(function(){
if($(this).attr('src') === ''){
this.src = '/default_feature_image.png';
}
});
Это автономное решение:
$(window).load(function() {
$('img').each(function() {
if (!this.complete || typeof this.naturalWidth == "undefined" || this.naturalWidth == 0) {
// image was broken, replace with your new image
this.src = 'http://www.tranism.com/weblog/images/broken_ipod.gif';
}
});
});
$.browser
устарел и удален сейчас, вместо этого использует обнаружение функции (в этом случае усложняется).
– lee penkman
3 December 2014 в 23:20
204 No Content
, это будет сломанное изображение.
– Carson Reinke
4 October 2016 в 14:59
Это меня расстраивало годами. Мое исправление CSS устанавливает фоновое изображение на img
. Если динамическое изображение src
не загружается на передний план, то на вкладке img
bg отображается метка. Это работает, если ваши изображения имеют размер по умолчанию (например, height
, min-height
, width
и / или min-width
).
Вы увидите значок сломанного изображения, но это улучшение. Протестировано до IE9 успешно. iOS Safari и Chrome даже не показывают сломанный значок.
.dynamicContainer img {
background: url('/images/placeholder.png');
background-size: contain;
}
Добавьте немного анимации, чтобы дать src
время для загрузки без фонового мерцания. Chrome замирает в фоновом режиме плавно, но на рабочем столе Safari нет.
.dynamicContainer img {
background: url('/images/placeholder.png');
background-size: contain;
-webkit-animation: fadein 1s;
animation: fadein 1s;
}
@-webkit-keyframes fadein {
0% { opacity: 0.0; }
50% { opacity: 0.5; }
100% { opacity: 1.0; }
}
@keyframes fadein {
0% { opacity: 0.0; }
50% { opacity: 0.5; }
100% { opacity: 1.0; }
}
Я использую встроенный обработчик error
:
$("img").error(function () {
$(this).unbind("error").attr("src", "broken.gif");
});
error()
устарел в 1,8 или выше.
Вот пример использования объекта HTML5 Image, завернутого JQuery. Вызовите функцию загрузки для основного URL-адреса изображения, и если эта загрузка вызывает ошибку, замените атрибут src изображения URL-адресом резервной копии.
function loadImageUseBackupUrlOnError(imgId, primaryUrl, backupUrl) {
var $img = $('#' + imgId);
$(new Image()).load().error(function() {
$img.attr('src', backupUrl);
}).attr('src', primaryUrl)
}
<img id="myImage" src="primary-image-url"/>
<script>
loadImageUseBackupUrlOnError('myImage','primary-image-url','backup-image-url');
</script>
Иногда использование события error
не представляется возможным, например. потому что вы пытаетесь сделать что-то на уже загруженной странице, например, когда вы запускаете код через консоль, букмарклет или скрипт, загружаемый асинхронно. В этом случае проверка img.naturalWidth
и img.naturalHeight
равна 0.
Например, здесь приведен фрагмент для перезагрузки всех сломанных изображений с консоли:
$$("img").forEach(img => {
if (!img.naturalWidth && !img.naturalHeight) {
img.src = img.src;
}
}
jQuery 1.8
// If missing.png is missing, it is replaced by replacement.png
$( "img" )
.error(function() {
$( this ).attr( "src", "replacement.png" );
})
.attr( "src", "missing.png" );
jQuery 3
// If missing.png is missing, it is replaced by replacement.png
$( "img" )
.on("error", function() {
$( this ).attr( "src", "replacement.png" );
})
.attr( "src", "missing.png" );
Я считаю, что это то, что вам нужно: jQuery.Preload
Вот пример кода из демонстрации, вы указываете загрузочные и не найденные изображения, и вы все установлено:
$('#images img').preload({
placeholder:'placeholder.jpg',
notFound:'notfound.jpg'
});
Я создал скрипт , чтобы заменить сломанное изображение с помощью события «onerror». Это может вам помочь.
//the placeholder image url
var defaultUrl = "url('https://sadasd/image02.png')";
$('div').each(function(index, item) {
var currentUrl = $(item).css("background-image").replace(/^url\(['"](.+)['"]\)/, '$1');
$('<img>', {
src: currentUrl
}).on("error", function(e) {
$this = $(this);
$this.css({
"background-image": defaultUrl
})
e.target.remove()
}.bind(this))
})
Я решил проблему с этими двумя простыми функциями:
function imgExists(imgPath) {
var http = jQuery.ajax({
type:"HEAD",
url: imgPath,
async: false
});
return http.status != 404;
}
function handleImageError() {
var imgPath;
$('img').each(function() {
imgPath = $(this).attr('src');
if (!imgExists(imgPath)) {
$(this).attr('src', 'images/noimage.jpg');
}
});
}
Это дерьмовая техника, но она в значительной степени гарантирована:
<img ... onerror="this.parentNode.removeChild(this);">
Я думаю, что у меня более элегантный способ делегирования событий и захвата событий на window
error
, даже если резервное изображение не загружается.
img {
width: 100px;
height: 100px;
}
<script>
window.addEventListener('error', windowErrorCb, {
capture: true
}, true)
function windowErrorCb(event) {
let target = event.target
let isImg = target.tagName.toLowerCase() === 'img'
if (isImg) {
imgErrorCb()
return
}
function imgErrorCb() {
let isImgErrorHandled = target.hasAttribute('data-src-error')
if (!isImgErrorHandled) {
target.setAttribute('data-src-error', 'handled')
target.src = 'backup.png'
} else {
//anything you want to do
console.log(target.alt, 'both origin and backup image fail to load!');
}
}
}
</script>
<img id="img" src="error1.png" alt="error1">
<img id="img" src="error2.png" alt="error2">
<img id="img" src="https://i.stack.imgur.com/ZXCE2.jpg" alt="avatar">
Точка:
head
и выполнить как первый встроенный скрипт. Таким образом, он будет выслушивать ошибки после сценария. img
атрибут после предоставления им backup.png
, чтобы избежать исчезновения backup.png
и последующего бесконечного цикла, как показано ниже: img ошибка-> резервная копия.png-> ошибка-> резервная копия.png-> ошибка -> ,,,,,
$(window).bind('load', function() {
$('img').each(function() {
if((typeof this.naturalWidth != "undefined" &&
this.naturalWidth == 0 )
|| this.readyState == 'uninitialized' ) {
$(this).attr('src', 'missing.jpg');
}
}); })
Источник: http://www.developria.com/2009/03/jquery-quickie---broken-images.html
;(window.jQuery || window.Zepto).fn.fallback = function (fallback) {
return this.one('error', function () {
var self = this;
this.src = (fallback || 'http://lorempixel.com/$width/$height')
.replace(/\$(\w+)/g, function (m, t) { return self[t] || ''; });
});
};
Вы можете передать путь к заполнителю и получить в нем все свойства из объекта с неудачным изображением через $*
:
$('img').fallback('http://dummyimage.com/$widthx$height&text=$src');
Pure JS. Моя задача состояла в том, что если образ «bl-once.png» пуст -> вставьте первый (который не имеет статуса 404) из списка массивов (в текущем каталоге):
<img src="http://localhost:63342/GetImage/bl-once.png" width="200" onerror="replaceEmptyImage.insertImg(this)">
Возможно, его нужно улучшить, но:
var srcToInsertArr = ['empty1.png', 'empty2.png', 'needed.png', 'notActual.png']; // try to insert one by one img from this array
var path;
var imgNotFounded = true; // to mark when success
var replaceEmptyImage = {
insertImg: function (elem) {
if (srcToInsertArr.length == 0) { // if there are no more src to try return
return "no-image.png";
}
if(!/undefined/.test(elem.src)) { // remember path
path = elem.src.split("/").slice(0, -1).join("/"); // "http://localhost:63342/GetImage"
}
var url = path + "/" + srcToInsertArr[0];
srcToInsertArr.splice(0, 1); // tried 1 src
if(imgNotFounded){ // while not success
replaceEmptyImage.getImg(url, path, elem); // CALL GET IMAGE
}
},
getImg: function (src, path, elem) { // GET IMAGE
if (src && path && elem) { // src = "http://localhost:63342/GetImage/needed.png"
var pathArr = src.split("/"); // ["http:", "", "localhost:63342", "GetImage", "needed.png"]
var name = pathArr[pathArr.length - 1]; // "needed.png"
xhr = new XMLHttpRequest();
xhr.open('GET', src, true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.status == 200) {
elem.src = src; // insert correct src
imgNotFounded = false; // mark success
}
else {
console.log(name + " doesn't exist!");
elem.onerror();
}
}
}
}
};
Итак, это будет вставьте правильный 'needed.png' в мой src или 'no-image.png' из текущего каталога.
Используя ответ Prestaul , я добавил несколько проверок, и я предпочитаю использовать способ jQuery.
<img src="image1.png" onerror="imgError(this,1);"/>
<img src="image2.png" onerror="imgError(this,2);"/>
function imgError(image, type) {
if (typeof jQuery !== 'undefined') {
var imgWidth=$(image).attr("width");
var imgHeight=$(image).attr("height");
// Type 1 puts a placeholder image
// Type 2 hides img tag
if (type == 1) {
if (typeof imgWidth !== 'undefined' && typeof imgHeight !== 'undefined') {
$(image).attr("src", "http://lorempixel.com/" + imgWidth + "/" + imgHeight + "/");
} else {
$(image).attr("src", "http://lorempixel.com/200/200/");
}
} else if (type == 2) {
$(image).hide();
}
}
return true;
}
Я не уверен, есть ли лучший способ, но я могу подумать о взломе, чтобы получить его - вы могли бы отправить сообщение Ajax на URL-адрес img и проанализировать ответ, чтобы увидеть, действительно ли изображение вернулось. Если он вернется как 404 или что-то еще, замените img. Хотя я ожидаю, что это будет довольно медленно.