如果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策略)等。显示合适的信息。谢谢。 我希望它能解决你的问题。