Подтвердить что ты не робот

Ошибка 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 не загружался. Я хочу отобразить пользовательское сообщение. Screenshot of console when I get error Скрипач здесь

Теперь, если я использую 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 при событии загрузки Спасибо!!

4b9b3361

Ответ 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