如果iframe src加载失败,则捕获错误。 错误: – “拒绝在框架中显示”http://www.google.co.in/“..”

我正在使用Knockout.js来绑定iframe src标记(这将相对于用户可configuration)。

现在,如果用户configuration了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无法加载。 我想显示自定义消息出错时控制台的屏幕截图 FIDDLE HERE

现在,如果我使用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中加载。

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

我认为你可以绑定iframe的load事件,事件在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/IvinvinDominin/ALBXR/4/

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

另外,google在响应头文件中设置了SAMEORIGIN的“ X-Frame-Options ”。

即使你做了一个ajax调用谷歌,你将无法检查响应,因为浏览器强制执行同源策略。

所以,唯一的select是从服务器发出请求,看看是否可以在IFrame中显示该网站。

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

onload将永远是触发器,我解决这个问题使用try catch块。它会抛出一个exception,当你尝试获取contentDocument。

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

我面临类似的问题。 我解决了它没有使用onload handler.I正在AngularJs项目,所以我使用$间隔和$超时。 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策略)等。显示合适的信息。谢谢。 我希望它能解决你的问题。