Erreur de capture si iframe src ne se charge pas. Erreur:-"a Refusé d'affichage" http://www.google.co.in/' dans un cadre.."

j'utilise Knockout.js pour lier la balise iframe src (ce sera configurable par rapport à L'utilisateur).

maintenant, si l'Utilisateur a configuré http://www.google.com (je sais qu'il ne se chargera pas dans iframe, thats pourquoi je l'utilise pour-scénario de ve) et qui doit être montré dans IFrame. mais il lance erreur: -

refusé d'afficher " http://www.google.co.in / ' dans un cadre parce qu'il set "X-Frame-Options" à "SAMEORIGIN'.

j'ai le code suivant pour Iframe: -

<iframe class="iframe" id="iframe" data-bind="attr: {src: externalAppUrl, height: iframeheight}">
    <p>Hi, This website does not supports IFrame</p>
</iframe>

ce que je veux, c'est, si l'url ne se charge pas. Je veux afficher message personnalisé . Screenshot of console when I get error VIOLON ICI

maintenant, si j'utilise onload et onerror comme: -

<iframe id="browse" style="width:100%;height:100%" onload="alert('Done')" onerror="alert('Failed')"></iframe>

il fonctionne chargement fin w3schools.com mais pas avec google.com.

deuxièmement: - si je le fais comme une fonction et d'essayer comme je l'ai fait dans mon violon, il ne fonctionne pas.

<iframe id="browse" style="width:100%;height:100%" onload="load" onerror="error"></iframe>

Je ne sais pas comment le faire tourner et capturer l'erreur.

modifié:- j'ai vu vouloir appeler une fonction iframe ne charge pas ou la question de charge dans stackoverflow mais il montre l'erreur pour les sites qui peuvent être chargés dans iframe.

aussi, j'ai regardé dans iFrame de débordement de piles sur l'événement de charge Merci!!

62
demandé sur Community 2013-03-07 17:56:11

6 réponses

vous ne pourrez pas faire cela du côté du client en raison de la même Politique D'origine définie par les navigateurs. Vous ne serez pas en mesure d'obtenir beaucoup d'informations de l'iFrame autres que les propriétés de base comme sa largeur et la hauteur.

aussi, google définit dans son en-tête de réponse un ' X-Frame-Options ' de SAMEORIGIN.

même si vous avez fait un appel ajax à google, vous ne serez pas en mesure d'inspecter la réponse parce que le navigateur applique la même Politique D'origine.

Donc, la seule option est de faire la demande de votre serveur pour voir si vous pouvez afficher le site dans votre IFrame.

Donc, sur votre serveur.. votre application web ferait une demande pour www.google.com et puis inspecter la réponse pour voir si elle a un argument d'en-tête de X-Frame-Options. Si elle existe, alors vous savez que L'IFrame va faire une erreur.

33
répondu Evan Larsen 2013-09-06 19:47:09

je pense que vous pouvez lier le load événement de l'iframe, l'événement se déclenche lorsque le contenu de l'iframe est entièrement chargé.

en même temps, vous pouvez lancer un setTimeout, si l'iFrame est chargé effacer le timeout alternativement laisser le feu de timeout.

Code:

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);
    }));

});

Démo: http://jsfiddle.net/IrvinDominin/QXc6P /

Second problème

c'est parce que vous manquez les paris dans l'appel de fonction inline; essayez de changer ceci:

<iframe id="browse" style="width:100%;height:100%" onload="load" onerror="error"></iframe>

dans ceci:

<iframe id="browse" style="width:100%;height:100%" onload="load('Done func');" onerror="error('failed function');"></iframe>

Démo: http://jsfiddle.net/IrvinDominin/ALBXR/4 /

18
répondu Irvin Dominin 2015-04-17 21:58:14

l'onload sera toujours trigger, je paresse ce problème utiliser le catch block.Il va jeter une exception lorsque vous essayez d'obtenir le contentDocument.

iframe.onload = function(){
   var that = $(this)[0];
   try{
        that.contentDocument;
   }
   catch(err){
        //TODO 
   }
}
5
répondu H.Eden 2017-08-08 04:55:11

j'ai fait face à un problème similaire. Je l'ai résolu sans utiliser un gestionnaire de charge.Je travaillais sur le projet AngularJs donc j'ai utilisé $ interval et $ timeout. U peut également utiliser setTimeout et setInterval.Voici le code:

 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);
 });

toutes les 0.4 secondes, continuez à vérifier la tête du document iFrame. J'ai quelque chose est présent.Le chargement n'a pas été arrêté par CORS car L'erreur de CORS indique une page vierge. Si rien n'est présent après 5 secondes, il y a eu une erreur (Cors politique), etc.. Afficher le message approprié.Grâce. J'espère que cela résout votre problème.

1
répondu viresh 2016-01-15 11:48:16

il s'agit d'une légère modification à la réponse D'Edens - qui pour moi dans chrome n'a pas compris l'erreur. Bien que vous obtiendrez toujours une erreur dans la console: "A refusé d'affichage" https://www.google.ca/ " dans un cadre, car il set 'X-Frame-Options" à "sameorigin'."Au moins, cela captera le message d'erreur et vous pourrez y faire face.

 <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>
0
répondu user2677034 2018-09-22 16:39:08

j'ai le même problème, chrome ne peut pas démarrer onerror si une erreur de charge srcrame.

mais dans mon cas, J'ai juste besoin de faire une requête http de domaine croisé, j'utilise donc script src/onload / onerror à la place d'iframe. il fonctionne bien.

0
répondu Engin Morse 2018-09-24 12:37:41