Ошибка Catch, если iframe src не загружается. Ошибка: - "Отказано для отображения" http://www.google.co.in/ "в кадре".
Я использую Knockout.js
для привязки тега iframe src
(это будет настраиваться по отношению к пользователю).
Теперь, если пользователь настроил http://www.google.com (я знаю, что он не будет загружаться в iframe, поэтому я использую его для сценария -ve), и это должно быть показано в IFrame.
но выдает ошибку: -
Отказался отображатьhttp://www.google.co.in/ в кадре, потому что это установите "X-Frame-Options" на "SAMEORIGIN".
У меня есть следующий код для Iframe: -
<iframe class="iframe" id="iframe" data-bind="attr: {src: externalAppUrl, height: iframeheight}">
<p>Hi, This website does not supports IFrame</p>
</iframe>
Я хочу, чтобы URL не загружался. Я хочу отобразить пользовательское сообщение.
Скрипач здесь
Теперь, если я использую onload и onerror как: -
<iframe id="browse" style="width:100%;height:100%" onload="alert('Done')" onerror="alert('Failed')"></iframe>
Он отлично работает при загрузке w3schools.com, но не с google.com.
Во-вторых: - если я сделаю это как функцию и попробую, как сделал в своей скрипке, это не сработает.
<iframe id="browse" style="width:100%;height:100%" onload="load" onerror="error"></iframe>
Я не знаю, как мне заставить его работать и фиксировать ошибку.
Отредактировано: - Я видел хочу вызвать функцию, если iframe не загружает или не загружает вопрос в stackoverflow, но показывает ошибку для сайтов, которые могут быть загружены в iframe.
Кроме того, я рассмотрел Staraoverflow iframe при событии загрузки
Спасибо!!
Ответы
Ответ 1
Вы не сможете сделать это со стороны клиента из-за той же политики происхождения, установленной браузерами. Вы не сможете получать большую информацию от iFrame, кроме основных свойств, таких как ширина и высота.
Кроме того, google устанавливает в своем ответе заголовок 'X-Frame-Options' из SAMEORIGIN.
Даже если вы сделали ajax-вызов для google, вы не сможете проверить ответ, потому что браузер применяет политику одинакового происхождения.
Итак, единственный вариант - сделать запрос с вашего сервера, чтобы увидеть, можете ли вы отобразить сайт в вашем IFrame.
Итак, на вашем сервере.. ваше веб-приложение отправит запрос на www.google.com, а затем проверит ответ, чтобы узнать, есть ли у него аргумент заголовка параметров X-Frame. Если он существует, вы знаете, что IFrame будет ошибкой.
Ответ 2
Я думаю, что вы можете связать событие load
iframe, событие запускается, когда содержимое iframe полностью загружено.
В то же время вы можете запустить setTimeout, если iFrame загружается, очистить тайм-аут в качестве альтернативы, чтобы запустить тайм-аут.
код:
var iframeError;
function change() {
var url = $("#addr").val();
$("#browse").attr("src", url);
iframeError = setTimeout(error, 5000);
}
function load(e) {
alert(e);
}
function error() {
alert('error');
}
$(document).ready(function () {
$('#browse').on('load', (function () {
load('ok');
clearTimeout(iframeError);
}));
});
Демо: http://jsfiddle.net/IrvinDominin/QXc6P/
Вторая проблема
Это потому, что вы пропускаете parens во встроенном вызове функции; попробуйте изменить это:
<iframe id="browse" style="width:100%;height:100%" onload="load" onerror="error"></iframe>
в это:
<iframe id="browse" style="width:100%;height:100%" onload="load('Done func');" onerror="error('failed function');"></iframe>
Демо: http://jsfiddle.net/IrvinDominin/ALBXR/4/
Ответ 3
Onload всегда будет триггером, я использую эту проблему, используя try catch block. Он будет генерировать исключение при попытке получить contentDocument.
iframe.onload = function(){
var that = $(this)[0];
try{
that.contentDocument;
}
catch(err){
//TODO
}
}
Ответ 4
Это небольшая модификация ответа Edens - который для меня в chrome не уловил ошибку. Хотя вы все равно получите сообщение об ошибке в консоли:
Msgstr "Отказано отображать"https://www.google.ca/"в кадре, потому что для" X-Frame-Options "установлено значение" sameorigin "." По крайней мере, это перехватит сообщение об ошибке, и вы сможете с ним справиться.
<iframe id="myframe" src="https://google.ca"></iframe>
<script>
myframe.onload = function(){
var that = document.getElementById('myframe');
try{
(that.contentWindow||that.contentDocument).location.href;
}
catch(err){
//err:SecurityError: Blocked a frame with origin "http://*********" from accessing a cross-origin frame.
console.log('err:'+err);
}
}
</script>
Ответ 5
У меня возникла аналогичная проблема. Я решил это без использования обработчика onload. Я работал над проектом AngularJs, поэтому использовал $interval и $timeout. U также может использовать setTimeout и setInterval.Here код:
var stopPolling;
var doIframePolling;
$scope.showIframe = true;
doIframePolling = $interval(function () {
if(document.getElementById('UrlIframe') && document.getElementById('UrlIframe').contentDocument.head && document.getElementById('UrlIframe').contentDocument.head.innerHTML != ''){
$interval.cancel(doIframePolling);
doIframePolling = undefined;
$timeout.cancel(stopPolling);
stopPolling = undefined;
$scope.showIframe = true;
}
},400);
stopPolling = $timeout(function () {
$interval.cancel(doIframePolling);
doIframePolling = undefined;
$timeout.cancel(stopPolling);
stopPolling = undefined;
$scope.showIframe = false;
},5000);
$scope.$on("$destroy",function() {
$timeout.cancel(stopPolling);
$interval.cancel(doIframePolling);
});
Каждые 0,4 секунды продолжают проверять заголовок документа iFrame. Я что-то присутствую. Загрузка не была остановлена CORS, поскольку ошибка CORS показывает пустую страницу.
Если ничего не было через 5 секунд, была некоторая ошибка (политика Cors) и т.д.
Покажите подходящее сообщение. Спасибо. Я надеюсь, что он решает вашу проблему.
Ответ 6
У меня та же проблема, Chrome не может запустить ошибку при ошибке загрузки iframe src.
но в моем случае
Мне просто нужно сделать междоменный http-запрос,
поэтому я использую скрипт src/onload/onerror вместо iframe.
это работает хорошо.
Ответ 7
Я решил это с window.length
.
Но с этим решением вы можете принять текущую ошибку (X-Frame или 404).
iframe.onload = event => {
const isLoaded = event.target.contentWindow.window.length // 0 or 1
}
MSDN