主要问题是我的扩展程序正在加载到目标网页上的每个iframe中。它还会将按钮显示在iframe中。我希望他们消失。窗口和文档对象显示为父窗口和文档对象。因此,检查文档位置是不可能的,例如因为它显示父级的位置而不是iframe的位置。
答案 0 :(得分:3)
您可以编写一个使用@noframes
元数据标题键的用户脚本,并使用this user script package for the addon sdk将用户脚本包含在Jetpack中。
编写用户脚本比编写Page Mods要容易得多。
答案 1 :(得分:2)
编辑:现在(已发布附加SDK版本1.11)pagemod
支持您要查找的内容。 See the docs和新attachTo
选项。
以下信息已过时(如果您针对加载项SDK 1.10或之前的版本构建,则可以使用该信息:
不幸的是,pagemod
会在页面的所有框架中插入您的脚本,而不是在顶部框架的每页上注入一次,就像您使用Chrome的内容脚本一样。当然,有一些停止执行脚本的解决方法(参见其他答案)。
但是如果你真的只想在每个页面注入一次脚本,在顶部框架上,你必须使用tabs
。使用此解决方案,您只需在必要时注入脚本。
Bellow我提供了从pagemod
移植到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);
});
}
}
});
答案 2 :(得分: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!
}
内容脚本仍将添加到每个页面,但它是iFrames的一个相对简单和轻量级的检查。