iframe contentWindow在缩短document.domain后抛出Access Denied错误

时间:2013-02-21 12:22:01

标签: javascript internet-explorer iframe dynamic access-denied

我通过以下方式动态创建IFRAME:

var wrapUpIframe = document.createElement("iframe");
wrapUpIframe.id = 'WrapUpDialog3';
wrapUpIframe.src = 'WrapUpDialog.html';    
document.body.appendChild(wrapUpIframe);
动态创建后

我的document.domainServername.dc.com缩短为dc.com

但是当我尝试访问contentWindow时,我收到了拒绝访问错误:

document.getElementById("WrapUpDialog3").contentWindow.SomeFunction();

注意:当我在HTML中静态定义IFRAME时,它可以正常工作 我还试图通过以下方式更改我的IFRAME document.domain

WrapUpDialog3.document.domain = dc.com;

我检查了document.domain和我的IFRAME域,它们都是相同的。

我该怎么办?

我正在使用IE9。

2 个答案:

答案 0 :(得分:9)

首先看一下这个post的正确答案。在我看来,这可能是你的问题。

如果不是那样,那么我从另一个post看到的这个快速黑客可能有所帮助。

 var frame = $('<iframe>')
.attr('id', 'myIframe')
.addClass('someClass')
.attr('src', 'javascript:(function () {' +'document.open();document.domain=\'myDomain.net\';document.close();' + '})();');
.appendTo($('#someDiv'));

不确定这是否相关,但我也在网上找到了这个link

好的,所以回复你的评论。 javascript函数没有分配源,它设置的文档域在I.E中显然无法正确完成。

请查看此link以获取其他示例和解释。

所以我想尝试的可能是这样的......

var wrapUpIframe = document.createElement("iframe");
wrapUpIframe.id = 'WrapUpDialog3';    
wrapUpIframe.src = setSrc();
document.body.appendChild(wrapUpIframe);

function setSrc(){document.open();document.domain=\'dc.com\';document.close();return 'WrapUpDialog.html';}

在运行设置文档域的函数后,您可能必须使用如何返回iframe的实际url。但从我所看到的情况来看,这可能对你有用。

我有一个类似的问题,但不完全相同的问题,这就是为什么我不能给你一个确切的解决方案。设置文档域的功能是让我超越访问被拒绝的错误。

您还可以将其添加到主文档中,以确保域匹配。

 <script type="text/javascript">
    document.domain = 'dc.com';
  </script>

我还想添加一个link,以便明确设置我之前使用过的document.domain。这对我来说过去很有帮助。特别是这句话......

  

明确设置值表示与a“合作”的意图   另一个子域上的脚本(在同一个父域下)。

多尔,你可能有时间问题。我找到了一些我刚刚测试过的代码(这里)。它确保在您尝试访问contentWindow之前加载iframe。

var iframe = document.createElement("iframe");
iframe.src = "WrapUpDialog.html";

if (iframe.attachEvent){
    iframe.attachEvent("onload", function(){
        alert("Local iframe is now loaded.");
    });
} else {
    iframe.onload = function(){
        alert("Local iframe is now loaded.");
    };
}

document.body.appendChild(iframe);

var iframeWindow = iframe.contentWindow || iframe.contentDocument.parentWindow;

答案 1 :(得分:2)

您如何提供文件?您是否在地址栏中看到file:///?如果是这样,请尝试使用网络服务器提供代码。

如果我使用file:///尝试使用您的代码,Google Chrome会出现访问被拒绝错误,但是当它从本地网络服务器提供时(即地址以http://localhost/开头),它会有效。