Firefox版本:chrome.tabs.onUpdated.addListener

时间:2013-12-15 00:34:29

标签: javascript google-chrome firefox google-chrome-extension firefox-addon

我有一个Chrome扩展程序,用于侦听页面上的更新。 onUpdated方法在页面上进行任何更改后调用侦听器。 如果添加或删除DOM节点>,则会调用侦听器。更新:似乎在加载请求后调用它。

我开始将此扩展程序移植到Firefox,到目前为止我找不到类似的功能。我想我可能需要深入研究XPCOM。

有人能指出我正确的方向吗? Firefox提供类似的东西吗?

谢谢!

3 个答案:

答案 0 :(得分:6)

如果您已经有Chrome扩展程序,那么当您尝试将其移植到Firefox附加组件时,绝对应该查看Addon SDK(这是编写Firefox附加组件的“新”方式,反对写XUL / XPCOM)。此SDK提供了您在其他扩展平台中找到的大多数“标准扩展功能”。

我对你的问题的表达方式感到有些困惑。你的标题非常明确:你正在寻找相当于chrome.tabs.onUpdated的标题。但是,在您的问题的正文中,您暗示此事件以某种方式用于检测何时添加/删除DOM节点。这是错误的。

Add-on SDK中没有一个与chrome.tabs.onUpdated等效的内容:

这些事件只能在附加组件的main.js中使用(相当于Chrome的背景页面)。如果要向内容脚本发送消息,请参阅this guide


如果您对任何标签更新事件(如上所述)不感兴趣,并且仅在DOM节点更改中感兴趣,只需坚持使用内容脚本,并在Chrome扩展程序和Firefox附加组件中使用几乎相同的代码。 Chrome's content script在清单文件中声明,而Firefox' content scripts在main.js中声明。

Chrome和Firefox都支持Mutation Observers,可用于有效获取DOM节点更改的通知。

答案 1 :(得分:2)

是的,Firefox支持这一点。只是在Firefox中,扩展可以基于xul,bootstraped或基于sdk,而sdk可能不支持扩展工作所需的一切。

以下解决方案适用于基于xul和bootstraped的扩展。

在我的自举扩展程序中,我使用了这个:

首先,定义一个tabProgressListener。 onLocationChange正是您要找的

var tabProgressListener = {
  onLocationChange: function (
      /*nsIDOMXULElement*/ aBrowser,
        /*nsIWebProgress*/ aWebProgress,
        /*nsIRequest*/ aRequest,
        /*nsIURI*/ aLocation) {
        myExtension.handleTabLocationChanged(aBrowser, aLocation);
  },

  onProgressChange: function() {},
  onSecurityChange: function() {},
  onStateChange: function() {},
  onStatusChange: function() {},
  onRefreshAttempted: function(
    /*nsIDOMXULElement*/ aBrowser,
    /*nsIWebProgress*/ webProgress,
    /*nsIURI*/ aRefreshURI,
    /*long*/ aMillis,
    /*boolean*/ aSameURI) {
      // must return true to allow http-meta refreshes
      return true;

  },
  onLinkIconAvailable: function() {}
};

然后在窗口加载

上添加tabProgressListener
var gBrowser = document.getElementById('content');
gBrowser.addTabsProgressListener(tabProgressListener);

最后,请记住删除进度监听器

gBrowser.removeTabsProgressListener(tabProgressListener);

请注意,虽然我不是addon-sdk的粉丝,但编写sdk扩展名比引导它更容易。

答案 2 :(得分:1)

不幸的是,您需要等到标签准备好访问该URL。因此,使用Add-on SDK,它的简化版本(仅适用于活动选项卡)将是:

main.js

var tabs = require('sdk/tabs');
var tab = tabs.activeTab;
var url = tab.url;
tab.on('ready', function() {
    if (tab.url === url) {
        //user just refreshed the page
        return;
    }
    url = tab.url;
    //The URL is different, let's code…
});

有关详细信息,请参阅docs for the tab module。如果您希望它适用于多个标签页,您可以从tabs.on('ready', function(tab) {…});开始,然后您必须创建一个网址数组,然后选中if (urls[tab.index] === tab.url) …

相关问题