【问题标题】:Firefox version of: chrome.tabs.onUpdated.addListenerFirefox 版本:chrome.tabs.onUpdated.addListener
【发布时间】:2013-12-15 00:34:28
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 查看此链接link
  • 您确定插入/删除节点时会触发chrome.tabs.onUpdated 事件吗?
  • 所以更准确地说。不是当我插入或删除任何节点时,而是当模态窗口加载了一些远程内容时,触发了 chrome.tabs.onUpdated 事件。所以实际上这取决于。

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


【解决方案1】:

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

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

插件 SDK 中没有一个与 chrome.tabs.onUpdated 等效的版本:

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


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

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

【讨论】:

  • 是的,我认为 chrome.tabs.onUpdated 事件是在任何 DOM 更新时触发的,因为当打开模式窗口时它会触发它。
  • 我基本上需要的是监听 URL 的变化。一些网站更改了整个 URL,而不仅仅是散列和应该触发的事件。所以 chrome.tabs.onUpdated 成功了,我会在每次更新后检查 URL,看看它是否改变了。
  • @fromvega 如果您记录onUpdated 事件的details 对象,您会看到"loading" 事件导致了此更改。根据您的描述,您似乎想要检测导航更改。在这种情况下,请使用 chrome.webNavigation 事件。据我所知,Firefox 没有这样的 API,因此您必须使用 PageMod 来检测框架的创建。
  • 没错,我想检测导航变化。
【解决方案2】:

是的,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 扩展比引导扩展要容易得多。

【讨论】:

    【解决方案3】:

    很遗憾,您需要等到选项卡准备好访问该 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) {…}); 开始,然后您必须创建一个 URL 数组,然后检查 if (urls[tab.index] === tab.url) …

    【讨论】:

    • 我之前尝试过,但有时它无法捕获 URL 更改。举个例子:如果你上谷歌,然后进行搜索,然后关注查看更多结果。 URL 和内容会更改几次,但这段代码不会捕捉到它。
    • 我遇到了与PageMod 类似的问题。尝试将 onunload 事件侦听器添加到您的内容脚本中,看看是否会有所不同。您不必在侦听器的函数中添加任何内容;只需注册它就可以了。
    • 你能举个例子吗?
    • 对不起,在度假。您将侦听器放在内容脚本中。我正在使用 Jquery,所以只使用了 $( window ).unload(function() {}); 如果你不使用它,window.onunload = function(){}; 也应该可以工作,虽然我还没有测试过。这种方法的唯一缺点是,当用户按下后退按钮时,它会阻止用户享受软刷新的好处(即整个网页必须从头开始重新加载)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2014-12-25
    • 2013-07-05
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多