繁体   English   中英

Firefox版本:chrome.tabs.onUpdated.addListener

[英]Firefox version of: chrome.tabs.onUpdated.addListener

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

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

有人可以指出我正确的方向吗? Firefox是否提供类似的功能?

谢谢!

如果您已经有了Chrome扩展程序,则在尝试将其扩展到Firefox加载项时,一定要查看Addon SDK (这是编写Firefox加载项的“新”方式,而不是编写XUL / XPCOM)。 该SDK提供了在其他扩展平台中可以找到的大多数“标准扩展功能”。

我对表达问题的方式有些疑惑。 您的标题非常清晰:您正在寻找chrome.tabs.onUpdated的等效项。 但是,在您的问题中,您的意思是,此事件以某种方式用于检测何时添加/删除DOM节点。 这是错误的。

附加SDK中没有chrome.tabs.onUpdated等效项:

这些事件只能在插件的main.js(与Chrome的背景页面等效)中使用。 如果要将消息发送到内容脚本,请参阅本指南


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

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

是的,Firefox支持。 仅仅是在Firefox扩展中,扩展可以基于xul,自举或基于sdk,而sdk可能不支持您的扩展正常工作所需的一切。

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

在我的自举扩展中,我使用以下命令:

首先,定义一个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扩展要比引导扩展要容易得多。

不幸的是,您需要等到选项卡准备就绪才能访问URL。 因此,使用附加软件开发工具包,它的简化版本(仅适用于活动选项卡)将是:

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…
});

有关更多信息,请参见标签模块文档 如果您希望它可用于多个选项卡,则可以从tabs.on('ready', function(tab) {…}); 然后,您必须创建一个URL数组,然后检查if (urls[tab.index] === tab.url) …

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM