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工作。