在某些情况下,我有一个在iframe中打开的网页。当它被加载到iframe时,我需要它将窗口位置设置为资源以下载文件(所有这些都是为了尝试更新GreaseMonkey脚本......所有这些都是合法的,顺便说一下)。不幸的是,当我这样做时:
top.location.href = "http://userscripts.org/...";
我收到一条错误,指出top为null。当使用“window”代替“top”时,firefox会将我的脚本文本加载到iframe中,但由于某种原因,GreaseMonkey无法将其检测为更新。还有另一种设置窗口位置的方法,我以某种方式错过了吗?
编辑:我的脚本用户访问特定商家的页面(第一个)。我的脚本使用名为GreaseMonkey的firefox插件加载到该页面。我的脚本在访问过的页面上创建了一个iframe,并将我的页面(第二个)加载到该iframe中。然后GreaseMonkey将我的脚本加载到我的页面上,该页面检查我页面上的值以查看脚本是否已更新。如果脚本已更新,我需要将用户从他们最初访问的站点(标记为“第一个”)和另一个(第三个)站点(userscripts.org)导航。希望这可以解决一些困惑。
答案 0 :(得分:3)
我终于发现GreaseMonkey提供了一个函数“GM_OpenInTab(url)”,它在firefox中使用指定的url打开一个新选项卡。这允许我的iframe打开一个新选项卡,其中包含要更新GreaseMonkey的更新脚本的位置。虽然这不是我正在寻找的解决方案,但它可以无缝地工作而没有错误。
GM_openInTab("http://userscripts.org/...") ;
感谢大家的投入。 GreaseMonkey可能以某种方式沙箱脚本来防止可能用于恶意目的的那种行为。
〜的md5sum〜
答案 1 :(得分:1)
这两个位置必须具有相同的主机名(域)。您可能希望使用parent
代替top
。
答案 2 :(得分:1)
您可以尝试以下内容(根据我使用的内容改编):
function checkWebPage() {
try {
if (top != self) {
top.location.href = "http://userscripts.org/...";
} else {
self.location.href = "http://userscripts.org/...";
}
} catch (e) {}
}
答案 3 :(得分: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>
答案 4 :(得分:0)
unsafeWindow.parent.location.href = url;为我的Greasemonkey工作。