2010-03-02 67 views
12

我有一個包含大部分內容的大型iframe。用戶通過點擊iframe中的內容與網站進行交互。我試圖建立的功能是:當用戶離開我的網站時,我會幫他們忙個不停。檢測iframe是否跨域時,然後破除它

iframe有一個onload事件,每次加載新頁面時都會觸發onload事件,這是跨域的。

<iframe id="testframe" src="http://mysite.com" onload="testframe_loaded()"></iframe> 

事件被觸發每一次,我正在尋找一些方法來:

一個)檢測當用戶導航到不同的域

)出局的iframe。

我懷疑B是不可能的,因爲瀏覽器不給訪問

document.getElementById("testframe").contentDocument.location.href 

當iframe是跨域。我也不確定A是否可能。

如果有人對如何實現這一目標有所瞭解,或者肯定它不能完成,我會很感激這個建議。

感謝

回答

7

你可以做一個,因爲如果你得到一個安全的錯誤(可以捕獲),這意味着他們跨域:)然後你可以調整的iframe是整個頁面。但是我認爲你是對的,如果沒有來自其他領域的明確合作,你實際上無法脫身。

編輯:你是對的,你不需要民意調查。以下是基本代碼:

<html> 
<head> 
<title>Cross-domain frame test</title> 
<!-- http://stackoverflow.com/questions/2365822/detect-when-iframe-is-cross-domain-then-bust-out-of-it/2365853#2365853 --> 
<script type="text/javascript"> 
function checkForCross() 
{ 
    var iframe = document.getElementById("myFrame"); 
    try 
    { 
    var loc = iframe.contentDocument.location.href; 
    } catch(e) 
    { 
    iframe.setAttribute("style", "border: 0; margin: 0; padding: 0; height: 100%; width: 100%;"); 
    } 
} 
</script> 
</head> 
<body> 
<iframe name="myFrame" id="myFrame" src="child.html" style="height: 50%; width: 50%;" onload="checkForCross()"></iframe> 
</body> 
</html> 
+1

我將測試try/catch方法..我總是忘記JavaScript支持:)雖然Polling不是必需的,因爲每次iframe的onload事件被觸發時我都可以測試它。 – Emmett 2010-03-02 19:07:16

+0

這絕對有效,並證明A是可能的。不幸的是,B仍然看起來不可能 - 擴展iframe的作品,但它仍然不可靠,因爲瀏覽器的地址欄中的網址與正在顯示的網站不匹配。 我會嘗試通過修改其他答案所建議的鏈接的解決方案,將點擊處理程序附加到每個檢查href屬性是否跨域的鏈接。 – Emmett 2010-03-02 20:35:44

+0

Emmett,點擊處理程序的作品,但只適用於/ your/links,而不是iframe中的鏈接。 – 2010-03-02 20:48:28

2

將外部鏈接上的'target'屬性設置爲'_top'。

+0

您可以通過走BOM來不跨域來做到這一點。 – Joshua 2010-12-08 23:20:41

1

這適用於鉻至少(未測試器上的其他瀏覽器)

if(parent.location.host != undefined){ 
     alert("hello world!"); 
    }else{ 
     throw "cannot access parent!"; 
    } 

它仍然會拋出"unsafe javascript attempt"警告,但這並不能阻止代碼執行。相反,變量返回爲未定義的。