主要问题是我的扩展程序正在加载到目标网页上的每个 iframe 中。它还放置了出现在 iframe 内的按钮。我希望他们消失。窗口和文档对象显示为父窗口和文档对象。因此,不可能检查文档位置,例如,因为它显示的是父级的位置而不是 iframe 的位置。
问问题
1301 次
3 回答
3
您可以编写一个使用@noframes
元数据标头键的用户脚本,并将用户脚本包含到您的 Jetpack 中,并使用插件 sdk 的此用户脚本包。
编写用户脚本也比编写 Page Mods 容易得多。
于 2011-09-08T20:49:13.427 回答
2
编辑:现在(已发布附加 SDK 版本 1.11)pagemod
支持您正在寻找的内容。请参阅文档和新attachTo
选项。
以下信息已过时(如果您针对 Add-on SDK 1.10 或更早版本构建,则可以使用:
不幸的是pagemod
,将您的脚本注入到页面的所有框架中,而不是像您使用 Chrome 的内容脚本实现的那样,在顶部框架上的每个页面只注入一次。当然,有一些解决方法可以停止脚本的执行(参见其他答案)。
但是,如果您真的想每页只注入一次脚本,在顶部框架上,您必须使用tabs
. 使用此解决方案,您的脚本只会在必要时被注入。
下面我提供了从pagemod
to移植的示例,以tabs
保持所有消息接收系统port
正常工作。如果您不仅需要接收消息,还需要使用同一port
对象发送消息,则可以轻松修改它。当我们在youtube.com域中时,脚本会被注入:
旧的pagemod方式:
var self = require("self");
var pagemod = require("page-mod");
pagemod.PageMod(
{
include: "*.youtube.com",
contentScriptFile: self.data.url("myContentScript.js"),
onAttach: function(worker)
{
worker.port.on("myMessageId", function(payload)
{
console.log("Message received: " + payload);
});
}
});
新标签方式:
var self = require("self");
var tabs = require("tabs");
tabs.on("ready", function(tab)
{
if (tab != undefined && tab.url != undefined && tab.url.split("/")[2] != undefined)
{
var domain = "youtube.com";
var host = tab.url.split("/")[2];
if (host == domain || host.substr(host.length - domain.length - 1) == "." + domain)
{
var worker = tab.attach({ contentScriptFile: self.data.url("myContentScript.js") });
worker.port.on("myMessageId", function(payload)
{
console.log("Message received: " + payload);
});
}
}
});
于 2012-10-25T13:58:14.353 回答
1
一种解决方法是在您的内容脚本中添加这样的内容:
if (window.frameElement === null){
// I'm in the topmost window
// Add buttons and things to the page.
}else{
// I'm in an iFrame... do nothing!
}
内容脚本仍将添加到每个页面,但它是对 iFrame 的相对简单和轻量级的检查。
于 2011-09-28T00:16:34.133 回答