7

主要问题是我的扩展程序正在加载到目标网页上的每个 iframe 中。它还放置了出现在 iframe 内的按钮。我希望他们消失。窗口和文档对象显示为父窗口和文档对象。因此,不可能检查文档位置,例如,因为它显示的是父级的位置而不是 iframe 的位置。

4

3 回答 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. 使用此解决方案,您的脚本只会在必要时被注入。

下面我提供了从pagemodto移植的示例,以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 回答