Как я могу обрабатывать ошибки при загрузке iframe?
У меня есть <iframe>
, который могут включать другие сайты, чтобы их пользователи могли POST
вернуть форму на мой сайт. Я хотел бы изящно обрабатывать случаи, когда мой сайт отключен, или мой сервер не может обслуживать содержимое <iframe>
(то есть тайм-аут ответа или ошибку 4xx или 5xx). Я попытался добавить объект onError
к объекту <iframe>
, но это, казалось, ничего не делало:
showIFrame = function() {
var iframe = document.createElement('iframe');
iframe.id = 'myIFrame';
iframe.src = 'http://myserver.com/someURLThatFailsToLoad';
iframe.onError = iframe.onerror = myHandler;
document.body.appendChild(iframe);
};
myHandler = function(error) {
document.getElementById('myIFrame').style.display = 'none';
console.error('Error loading iframe contents: ' + error);
return true;
};
Если мой сервер возвращает 404
, я просто получаю содержимое не найденной страницы в <iframe>
. Фактически, этот обработчик ошибок никогда не срабатывает. Есть ли способ сделать эту работу?
(Я сейчас тестирую в Chrome, но мне бы хотелось, чтобы он также работал для FF и IE >= 7.)
Ответы
Ответ 1
Чтобы определить, включен ли ваш сервер или нет, вы можете включить пустой файл script из своего собственного домена. Когда сервер не работает, обработчик события onerror
запускает:
var el = document.createElement('script');
el.onerror = errorFunction;
el.src = "somebogusscript.js?" + new Date().getTime();
document.body.appendChild(el);
Примечание. Не забудьте добавить случайную строку в атрибут src
, чтобы клиент не использовал кешированную версию (что вообще могло остановить просмотр на сервере).
Ответ 2
Возможно, вы могли бы попробовать onErrorUpdate
для обработчика события? Я не видел обработчик onError
для iFrames. Если это не сработает, вы можете попробовать onLoad
, а затем проверить источник iframe или заголовок его для сообщения 404.
Например:
if (frameDoc.title == 'title the server sends for 404') {
Источник:
http://bytes.com/topic/javascript/answers/166288-catch-404-when-using-iframe
iFrame Methods: http://www.java2s.com/Code/HTMLCSSReference/HTML-Tag-Reference/iframeJavaScriptMethods.htm
Свойства iFrame: http://www.java2s.com/Code/HTMLCSSReference/HTML-Tag-Reference/iframeJavaScriptProperties.htm
Ответ 3
Один из способов - установить тайм-аут JavaScript при выполнении запроса. Если ваш таймаут срабатывает перед событием onload iframe, содержимое не загружается. Затем вы можете установить iframe.src примерно: blank, delete или reuse iframe.