2009-10-29 93 views
2

在某些情況下,我有一個在iframe中打開的網頁。當它被加載到該iframe中時,我需要它將窗口位置設置爲資源以下載文件(所有這些都是爲了嘗試更新GreaseMonkey腳本......所有合法的,btw)。不幸的是,當我這樣做:JavaScript iframe破壞

top.location.href = "http://userscripts.org/..."; 

我得到一個錯誤,指出頂部爲空。當使用「窗口」代替「頂部」時,firefox會將我的腳本文本加載到iframe中,但由於某種原因,GreaseMonkey無法將其檢測爲更新。是否有另一種方法來設置我錯過了某個窗口的窗口的位置?

編輯:我的腳本的用戶訪問特定商家的頁面(第一個)。我的腳本使用名爲GreaseMonkey的firefox插件加載到該頁面中。我的腳本在訪問頁面上創建一個iframe,並將我的頁面(第二個)加載到該iframe中。 GreaseMonkey然後將我的腳本加載到我的頁面上,該頁面檢查頁面上的值以查看腳本是否已更新。如果腳本已更新,我需要將我的用戶從他們最初訪問的網站(標記爲「第一個」)和另一個(第三個)網站(userscripts.org)導航出去。希望這會消除一些混亂。

回答

3

我終於找到了的GreaseMonkey提供了一個功能「GM_OpenInTab(URL)」,這將打開Firefox並指定URL的新標籤。這使我的iframe可以打開一個新選項卡,其中GreaseMonkey的更新腳本的位置可以更新。雖然這不完全是我正在尋找的解決方案,但它無縫工作,沒有任何錯誤。

GM_openInTab("http://userscripts.org/...") ; 

感謝大家的意見。 GreaseMonkey有可能通過沙箱腳本來防止那些可能用於惡意目的的行爲。

〜的md5sum〜

+0

有人可以解釋爲什麼這是downvoted? – 2009-12-07 20:04:42

1

這兩個位置必須具有相同的主機名(域)。您可能想要使用parent而不是top

+0

iframe被加載到其他人的內容中。當需要對腳本進行更新時,我需要將它從網站重定向。哪兩個地點需要在同一個域中?混合中有三個不同的域:導航到的域,注入的iframe加載我的域,我的iframe需要重定向到userscripts.org。 – 2009-10-29 19:41:42

+0

安全限制可防止頁面訪問來自不同域的區域,但iframe(在常用瀏覽器的常規條件下)能夠強制頂層導航。 – Pool 2009-10-29 19:44:57

+0

對,但我得到「top is null」。使用「parent」呈現與使用「top」(「window is null」)相同的結果... – 2009-10-29 19:50:52

1

你可以嘗試以下方法(改編自我用的東西):

function checkWebPage() { 
    try { 
     if (top != self) { 
      top.location.href = "http://userscripts.org/..."; 
     } else { 
      self.location.href = "http://userscripts.org/..."; 
     } 
    } catch (e) {} 
} 
+0

從原始問題「我得到一個錯誤,指出頂部爲空。「我需要它每次都設置主窗口的位置,而不管我的文檔是加載在iframe中,還是作爲唯一的窗口內容 – 2009-10-29 19:48:10

+0

即使top爲空,該腳本也應該工作 – Pool 2009-10-29 19:54:49

+0

如果top爲null,沒有「.location」屬性...因此,錯誤指出「top爲null」,然後它總是使用self,在這種情況下,它與「window」具有相同的效果,它只是將我的腳本文本加載到iframe,除非訪問者在我的頁面上,而不是我正在注入我的iframe的頁面 – 2009-10-29 20:05:20

0

我曾多次與iframe和我發現它是更安全與文件的狀態下工作。我將通過一個例子傳遞一個代碼。

在這個例子中,我使用jQuery,但不是必需的功能。

<head> 
<script> 
(function($) { 
$.documentCtrolState = function(d,f,t) 
{ 
    try{ 
     t=(typeof(t)=="undefined")?100:t; 
     if (d.readyState=="complete") //the document has been completely loaded, successfully or unsuccessfully 
     f(true); 
     else 
     setTimeout(function(){$.documentCtrolState.call(this,d,f,t);}, t); 
    }catch(ex){ 
     f(false, ex); 
    } 
}; 
})(jQuery); 

$(function(){ 

    $myIframeRef = $(document.myIFrame); 
    $myIframeRef.attr("src", "mypage.php"); 

    $.documentCtrolState($myIframeRef.window.document, ThenLoadIFrame, 100); 

}); 

ThenLoadIFrame = function(state, ex) 
{ 
    alert("State " + state); 
} 


</script> 
</head> 
<body> 
<iframe src="" id="myIFrame"></iframe> 
</body> 
+0

這很好,並且可以安全地用iframe加載我的腳本......但我需要腳本引用的腳本窗口,而不是iframe – 2009-10-29 20:08:52

0

unsafeWindow.parent.location.href = URL;在Greasemonkey工作。