10

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

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

在动态创建后 mydocument.domain被缩短Servername.dc.com为 only dc.com

但是当我尝试访问时,contentWindow出现访问被拒绝错误:

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

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

WrapUpDialog3.document.domain = dc.com;

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

我能做些什么?

我正在使用 IE9。

4

3 回答 3

9

首先看看这篇文章的正确答案。在我看来,这可能是你的问题。

如果不是这样,那么我从另一篇文章中看到的这个快速破解可能会有所帮助。

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

不确定这是否相关,但我也在网络链接上找到了这个。

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

查看此链接以获取另一个示例和说明。

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

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>

我还想添加一个链接,以对我之前使用的显式设置 document.domain 进行一些解释。这在过去对我很有帮助。特别是这句话...

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

Dor,您可能遇到了时间问题。我发现了一些我刚刚测试过的代码(这里)对我有用。它确保在您尝试访问 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;
于 2013-03-06T18:36:26.560 回答
2

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

如果我尝试使用您的代码,谷歌浏览器会给出拒绝访问错误file:///,但是当从本地网络服务器提供服务时它可以工作(即地址以 开头http://localhost/)。

于 2013-03-07T19:16:16.740 回答
1

由于您尚未接受任何给出的答案,因此您可能仍然有问题。

尝试document.domain在两个 HTML 页面中显式设置(您似乎只在一个页面中执行此操作)。这意味着正如@Vic 建议的那样,您需要将以下 javascript 代码添加到包含 iframe 的 HTML 中:

document.domain = 'dc.com';

这意味着您的代码将如下所示:

document.domain = 'dc.com';
var wrapUpIframe = document.createElement("iframe");
wrapUpIframe.id = 'WrapUpDialog3';
wrapUpIframe.src = 'WrapUpDialog.html';    
document.body.appendChild(wrapUpIframe);

然后,WrapUpDialog.html本身(不在主页中,因为那样你会绕过安全系统!)你还需要设置document.domain

document.domain = dc.com;

所以你的这条线将不起作用:

WrapUpDialog3.document.domain = 'dc.com';

因为WrapUpDialog.html它本身需要授予其“父”页面执行其 javascript 的权限。

此页面上有更多信息:document.domain = document.domain 做什么?.

最后提示:请使用不同的浏览器尝试您的代码:IE9、Firefox、Google Chrome。这可以帮助您确定您是否正在处理某个特定浏览器的怪癖。

于 2013-03-10T10:27:08.297 回答