如何从Firefox插件访问选项卡中显示的网页内容

如何从Firefox插件访问选项卡中显示的网页内容,firefox,firefox-addon,firefox-addon-sdk,Firefox,Firefox Addon,Firefox Addon Sdk,在Firefox扩展中,我试图通过插入DOM元素将表单添加到网页中,然后处理用户在表单中输入的任何数据 我尝试了几种方法,但无法将我的表单插入网页的文档。我尝试过使用不同类型的附加组件,Overlay(XUL)和附加组件SDK,但我一直无法让它正常工作 Overlay/XUL:我进行了调查,没有发现任何东西专门告诉我如何更改网页的内容 使用插件SDK:我找到的唯一有效代码是“”中的演示代码,它似乎给出了: var html=sth $(“body”).html(html) 我试过: $('.id

在Firefox扩展中,我试图通过插入DOM元素将表单添加到网页中,然后处理用户在表单中输入的任何数据

我尝试了几种方法,但无法将我的表单插入网页的
文档
。我尝试过使用不同类型的附加组件,Overlay(XUL)和附加组件SDK,但我一直无法让它正常工作

  • Overlay/XUL:我进行了调查,没有发现任何东西专门告诉我如何更改网页的内容
  • 使用插件SDK:我找到的唯一有效代码是“”中的演示代码,它似乎给出了:
    var html=sth
    $(“body”).html(html)
    我试过:
    $('.id_of_ele').html('I want show')
    它不起作用
  • 到目前为止,唯一让我接近的是使用
    unsafeWindow.document
    ,但我认为这是一个非常糟糕的主意,而且代码看起来非常糟糕

  • 如何从Firefox扩展中访问网页的
    文档

    如果您正在寻找已知工作代码的示例,您可以随时查看哪些代码与您想要完成的工作接近,并查看它们是如何完成的。显然,您应该查看许可证(链接在每个扩展页面上),以查看代码的法律状态。这里有成千上万的工作实例。其中绝大多数都有代码,其许可方式允许您重复使用

    您试图使用的jQuery访问依赖于指向要修改的文档的
    文档
    变量。在运行Firefox插件的上下文中,
    document
    变量默认情况下可能指向您感兴趣或根本没有定义的网页的祖先文档。
    文档
    的实际内容将取决于从中调用附加代码的上下文。在Firefox插件中,默认情况下,
    document
    变量几乎永远不会指向网页的内容。您必须记住,您编写的代码旨在运行在比用于网页内容脚本的上下文大得多的上下文(整个浏览器/用户代理)中(浏览器中的上下文仅限于运行脚本的网页的内容,或从源自页面的引用中获取的数据)

    获取当前所选选项卡的文档访问权限:

    更改内容文档非常简单。您可以像更改任何JavaScript一样更改它。您可能会发现令人沮丧的问题是获取对文档的引用

    Firefox和Firefox对整个浏览器都有很大的影响力。但是,上下文以及
    窗口所指向的内容,甚至是它的定义,在很大程度上取决于JavaScript的调用方式。这可能会令人困惑和沮丧。在MDN上,有一个文档“”描述了许多问题

    通过扩展,您可以访问所有窗口和选项卡。但是,您可能需要的只是一些代码,使您能够访问当前选定的文档

    这应该适用于所有上下文,以便为当前所选选项卡获取对文档的引用:

    var selectedTabWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                           .getService(Components.interfaces.nsIWindowMediator)
                           .getMostRecentWindow("navigator:browser");
    var selectedTabDocument = selectedTabWindow.content.document;
    
    如果您的代码是从内容脚本转换而来的,而内容脚本只希望找到
    窗口
    文档
    对象,那么您可以编写如下代码:

    if (typeof window === "undefined") {
        var window;
    } else {
        //Keep a reference to whatever was defined as window.
        var originalWindow = window;
    }
    //Get the window from the most recently selected tab.
    window = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                           .getService(Components.interfaces.nsIWindowMediator)
                           .getMostRecentWindow("navigator:browser");
    
    //Now that we have a window for the most recently selected tab,
    //  get the document for it.
    if (typeof document === "undefined") {
        var document;
    } else {
        //Keep a reference to whatever was defined as document.
        var originalDocument = document;
    }
    document = window.content.document;
    
    //Now that we have a window for the most recently selected tab,
    //  get the gBrowser for it.
    if (typeof gBrowser === "undefined") {
        var gBrowser;
    } else {
        //Keep a reference to whatever was defined as gBrowser.
        var originalGBrowser = gBrowser;
    }
    gBrowser = window.gBrowser;
    
    显然,上述内容将覆盖当前定义为
    窗口
    文档
    浏览器
    的所有变量。根据运行的上下文和定义这些变量的范围,这可能是一件好事,也可能是一个坏主意。例如,如果代码在弹出窗口中运行,然后
    窗口
    是对弹出窗口的引用。在这种情况下,您可以通过以下方式获得对打开弹出窗口的窗口的引用:

    var windowWhichOpendedThisOne = window.opener;
    var documentForWindowWhichOpendedThisOne = window.opener.content.document;
    
    如果您在事件处理程序中,则可以从以下位置获取事件目标的窗口:

    var windowInWhichEventTargetExists = event.view;
    
    根据URL选择要执行的操作:

    一旦您获得了正确的
    文档
    ,就可以很容易地根据文档的URL选择要执行的操作:

    var currentUrl = document.location.href;
    

    这似乎更像是一个咆哮,而不是一个真正的问题。@MikeW,更新。谢谢~我理解你的沮丧。当我第一次开始使用插件时,我花了几个月的时间进行了探索,最终我成功了。为了帮助你开始了解这个主题:哦,哇,他们删除了我花了很多时间制作的帖子。这绝对是可笑的我们。谢天谢地,我在这里备份了它,所以请查看:@Noitidart:我建议使用扩展来保存文本框的所有编辑内容。它可以从崩溃、错误删除等中进行更广泛的恢复。e10即将出现,因此访问内容将很棘手。也许我们应该建议他使用插件sdk@Noitidart:我已将此页面标记为以后可能需要更新的页面。但是,e10仍处于开发阶段,不稳定,默认情况下未启用(我已尝试在我的主配置文件中启用它,我正在Aurora上运行)。启用e10后,它会有效地锁定。应该有垫片使扩展在相当长的时间内正常工作。如果他们移除这些垫片,将破坏任何访问文档内容的非SDK加载项。这将是一个坏主意™; 并不是说Mozilla从来没有执行过一个坏主意™ 关于扩展。