我能在父窗口中捕获Iframe的异常吗?

22

我在一个页面中有一个IFrame,并且IFrame中有一些JavaScript。在运行时,IFrame中的JavaScript会抛出异常,我想在父窗口上捕获这个异常。该怎么做?

<html> 
<head> 
<script type="text/javascript"> 
var frm123 = document.getElementById("frm123"); 
frm123.contentWindow.onerror = function() { 
    alert('error caught'); 
} 
function loadData() { 
    var oRTE = document.getElementById("frm123").contentWindow.document;
    oRTE.open(); 
    oRTE.write(txt123.value);
    oRTE.close();
} 
</script> 
</head> 
<body> 
<input type="button" onclick="loadData();" value="load"> 
<input type="text" id="txt123"> 
<iframe id = "frm123" > 
</body> 
</html>

邮编和异常信息 - Hkachhia
3个回答

39

答案取决于您是否控制iframe代码以及它是否与主页面属于同一个域。

如果是同一个域,则可以通过以下方式从包装文档设置错误处理函数:

document.getElementById("myiframe").contentWindow.onerror=function() {
    alert('error!!');
    return false;
}

在设置错误处理程序之前,确保等待iframe完成加载。

如果不是相同的域,但您控制着iframe内容(两个域都在您的控制下),则可以使用跨域通信框架与外部框架进行通信(搜索谷歌或自己构建),即通过从iframe内部设置onerror处理程序来捕获错误,并通过框架将其发送到外部文档。

如果不是相同的域并且您无法控制iframe,则由于安全限制,外部文档无法了解其中发生的情况。


1
如果页面加载过程中出现异常,我该怎么办? - obenjiro
那么,如果你无法在外部进行控制,你就会遇到问题。 - TheZuck

4

.onError()函数无法正常工作可能有几个原因,其中之一可能是由于跨域URL。为此,在实际加载iFrame之前,您应该实现检查操作,并使用以下代码:

var url = "google.com"
var loading_url = "/empty.html"
document.getElementById("iframe").src = loading_url;
$.ajax({
url: url,
type: 'GET',
complete: function(e, xhr, settings){
     if(e.status === 200){
          document.getElementById("iframe").src = url;
     }
  }
});

这在跨域情况下是行不通的,状态码在这些情况下为0。

还有一个要检查的是 .onError() 处理程序,请根据以下示例检查是否符合您的条件

如何处理加载iframe时的错误?

有许多其他选项或调整来处理此类错误:

if (frameDoc.title == 'title of page after expection occur')

也可以使用 iFrame 的 .onLoad() 事件来完成工作。


2

唯一的方法是如果框架在同一个域上,这种情况下你可以从父级进行操作:

iframe.contentWindow.onerror = function(){
    // handle error
}

<html> <head> <script type="text/javascript"> var frm123 = document.getElementById("frm123"); frm123.contentWindow.onerror = function(){ alert('error caught'); } function loadData() { var oRTE = document.getElementById("frm123").contentWindow.document; oRTE.open(); oRTE.write(txt123.value); oRTE.close();} </script></head> <body> <input type="button" onclick="loadData();" value="load"> <input type="text" id="txt123"> <iframe id = "frm123"> </body> </html> - Arif Hasan
@ArifHasan 请将上述代码写在您的问题中,这样其他人就可以帮助您了。 - Hkachhia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接