2013-02-21 221 views
10

後,我在下面的方式動態地創建一個IFRAME:動態創建後IFRAME contentWindow引發拒絕訪問錯誤縮短document.domain的

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

document.domain正在從Servername.dc.com縮短爲dc.com

但是當我嘗試訪問contentWindow我得到一個訪問被拒絕錯誤:

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

注意:當我在HTML中靜態定義IFRAME時,它工作正常。
我也試圖改變我的IFRAME document.domain通過以下方式:

WrapUpDialog3.document.domain = dc.com; 

我檢查都document.domain和我的IFRAME域,它們都是相同的。

我能做些什麼?

我正在使用IE9。

+0

在什麼瀏覽器中你會得到這種行爲?如果我將你的代碼輸入到Chrome調試器中,我可以很好地訪問'el.contentWindow'。請注意,不只是域需要匹配,而是完整的源,所以你可以嘗試比較兩個窗口中的「document.location.origin」。 – 2013-02-21 15:17:29

+0

@nhaldimann我與IE9 – 2013-02-21 15:19:47

+0

工作,這已經在這裏找到答案: http://stackoverflow.com/questions/364952/jquery-javascript-accessing-contents-of-an-iframe 伯特蘭 – Bertrand 2013-03-05 19:49:29

回答

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';} 

你可能有玩弄如何運行設置文檔域函數後返回實際的URL的iframe中。但從我所看到的這可能適用於你。

我有一個類似的問題,但不完全相同的問題,這就是爲什麼我不能給你一個確切的修復。設置文檔域的功能是讓我通過訪問被拒絕的錯誤。

您也可以將其添加到您的主文檔,以確保域匹配。

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

我也想添加一個link一些解釋上明確設置,我以前用的document.domain的。這在過去對我有幫助。特別是這個報價...

Explicitly setting the value indicates intent to "cooperate" with a script on another subdomain (under the same parent domain).

多爾,你可能有時間問題。我發現了一些我剛測試過的代碼(這裏),對我來說很有用。它確保在嘗試訪問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; 
+0

感謝您的回覆,我的src應該是一個外部html頁面 - WrapUpDialog.html,如何使用您的建議加載它? – 2013-03-07 07:14:03

+0

Dor,你是否試圖加載你在這個問題中提到的js函數(http://stackoverflow.com/questions/14849606/load-external-html-file-to-div-and-use-its-js-functions )在這個HTML頁面? – Vic 2013-03-08 14:47:18

+1

Dor,哪部分幫助? – Vic 2013-04-10 16:02:55

2

如何爲您的文件提供服務?你在地址欄中看到file:///嗎?如果是這樣,請嘗試使用網絡服務器提供您的代碼。

如果我使用file:///嘗試您的代碼,Google Chrome會發出拒絕訪問錯誤消息,但在通過本地網絡服務器提供服務時(例如,地址以http://localhost/開頭),Google Chrome會生效。

+0

我使用普通的HTML頁面,沒有文件 – 2013-03-07 22:41:26

1

由於您還沒有接受任何給出的答案,您可能仍然有問題。

嘗試在兩個HTML頁面中顯式設置document.domain(您似乎只在一個頁面中執行此操作)。這意味着,@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; 

所以這行的Y我們將不起作用:

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

因爲WrapUpDialog.html本身需要將權限授予其「父」頁面來執行它的JavaScript。

本頁有更多信息:What does document.domain = document.domain do?

最後提示:請嘗試使用不同瀏覽器的代碼:IE9,Firefox,Google Chrome。這可以幫助您確定您是否正在處理某個特定瀏覽器的怪癖。