如果iframe src无法加载,则会出现捕获错误.错误: - "拒绝在框架中显示'http://www.google.co.in/'.."

Shu*_*ubh 68 iframe jquery same-origin-policy knockout.js

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>
Run Code Online (Sandbox Code Playgroud)

我想要的是,如果网址无法加载.我想显示自定义消息. 我收到错误时控制台的屏幕截图 骗子在这里

现在,如果我使用onload和onerror作为: -

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

它可以正常加载w3schools.com,但不能与google.com.

其次: - 如果我把它作为一个功能,并尝试像我在我的小提琴,它不起作用.

<iframe id="browse" style="width:100%;height:100%" onload="load" onerror="error"></iframe>
Run Code Online (Sandbox Code Playgroud)

我不知道如何让它运行并捕获错误.

编辑: - 我已经看到如果iframe没有在stackoverflow中加载或加载问题,想要调用函数,但它显示可以在iframe中加载的网站的错误.

另外,我已经在加载事件上看了Stackoverflow iframe 谢谢!!

Eva*_*sen 40

由于浏览器设置的同源策略,您无法从客户端执行此操作.除了宽度和高度等基本属性之外,您无法从iFrame获取更多信息.

此外,谷歌在其响应标题中设置了SAMEORIGIN 的" X-Frame-Options ".

即使您对谷歌进行了ajax调用,您也无法检查响应,因为浏览器强制实施同源策略.

因此,唯一的选择是从您的服务器发出请求,看看您是否可以在IFrame中显示该网站.

因此,在您的服务器上......您的网络应用程序会向www.google.com发出请求,然后检查响应以查看它是否具有X-Frame-Options的标头参数.如果确实存在,那么您就知道IFrame会出错.

  • onload总是起作用,afaik,同样的起源无论如何. (2认同)

Irv*_*nin 15

我认为您可以绑定loadiframe的事件,当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);
    }));

});
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/IrvinDominin/QXc6P/

第二个问题

这是因为你错过了内联函数调用中的parens; 尝试改变这个:

<iframe id="browse" style="width:100%;height:100%" onload="load" onerror="error"></iframe>
Run Code Online (Sandbox Code Playgroud)

进入这个:

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

演示:http://jsfiddle.net/IrvinDominin/ALBXR/4/

  • 嘿,只是看着小提琴 - 它永远不会抛出错误. (42认同)
  • 我在Ubuntu和Chrome上 - 无论我在文本框中放入什么网址,它都说"完成"和"完成功能":( (11认同)
  • 减去1因为上面的注释状态:当iframe无法加载时,小提琴从不抛出预期的错误消息.这是因为iframe的加载事件即使在不加载内容时也会触发. (8认同)
  • @IrvinDomininakaEdward:这两个小提琴链接都不起作用......它没有打开...你删除了小提琴吗? (3认同)
  • 这不应该是所选答案。以下是Evan提出的一种说法是正确的:浏览器安全性阻止了对此的检测。 (2认同)
  • onerror 不再从这个小提琴触发。无论哪种情况,都只是获得“完成”事件。 (2认同)

H.E*_*den 7

onload将始终触发,我解决此问题使用try catch block.当您尝试获取contentDocument时,它将抛出异常.

iframe.onload = function(){
   var that = $(this)[0];
   try{
        that.contentDocument;
   }
   catch(err){
        //TODO 
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 这也不适用于跨域 - 它会以任何方式抛出错误 (11认同)

use*_*034 6

这是对Edens答案的略微修改-对我来说,Chrome浏览器没有捕获该错误。尽管您仍然会在控制台中收到错误消息:“拒绝在框架中显示' 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>
Run Code Online (Sandbox Code Playgroud)

  • 这会导致“that.contentDocument”出现“无法读取 null 的属性“位置””错误,并且许多工作站点在加载过程中仍会在“that.contentWindow”上抛出错误。 (2认同)

小智 6

我用 解决了它window.length。但通过此解决方案,您可以获取当前错误(X-Frame 或 404)。

iframe.onload = event => {
   const isLoaded = event.target.contentWindow.window.length // 0 or 1
}
Run Code Online (Sandbox Code Playgroud)

微软软件定义网络