检测Firefox加载项中的选项卡URL更改

检测Firefox加载项中的选项卡URL更改,firefox,firefox-addon,firefox-addon-sdk,Firefox,Firefox Addon,Firefox Addon Sdk,我在Chrome上有一个功能扩展,可以监视活动选项卡的URL更改 具体来说,我需要检测URL何时更改,但没有新页面加载或导航。有些网站会这样做(例如,当您单击在YouTube上观看另一个视频时) 在Chrome上,我通过以下方式实现了这一点: chrome.tabs.onUpdate.addListener(函数(tabId、changeInfo、tab){ if(changeInfo&&changeInfo.status==“完成”){ //在这里做事 } }); 我如何在Firefox插件

我在Chrome上有一个功能扩展,可以监视活动选项卡的URL更改

具体来说,我需要检测URL何时更改,但没有新页面加载或导航。有些网站会这样做(例如,当您单击在YouTube上观看另一个视频时)

在Chrome上,我通过以下方式实现了这一点:

chrome.tabs.onUpdate.addListener(函数(tabId、changeInfo、tab){
if(changeInfo&&changeInfo.status==“完成”){
//在这里做事
}
});
我如何在Firefox插件中检测到这样的变化

我被告知使用:,但我无法将其组合起来。问题之一是扩展中未定义
gBrowser

我做错了什么


有更简单的方法吗?

如果您使用的是附加SDK,那么您看到的文档就错了。这是你的电话号码

如上所述,您可以创建一个如下所示的侦听器:

var tabs = require("sdk/tabs");

// Listen for tab openings.
tabs.on('open', function onOpen(tab) {
  myOpenTabs.push(tab);
});

// Listen for tab content loads.
tabs.on('ready', function(tab) {
  console.log('tab is loaded', tab.title, tab.url);
});

您查看的所有文档都应该是

的一个子集。我发现
激活
页面显示
事件,在这两个事件之间,涵盖了我可以在切换选项卡、在新选项卡中打开页面、关闭选项卡、刷新页面和键入新URL之间对URL进行的所有更改

var updateURL = function (tab) {
 var oldURL = url;
 var url = tab.url;
 console.log(url);
};

tabs.on("activate", updateURL);
tabs.on("pageshow", updateURL);

使用ProgressListener获得有关位置更改的通知

要安装侦听器,请使用viewFor将SDK选项卡转换为其原始(旧)表示形式。 modelFor和getTabForContentWindow可以进行反向转换

const tabs = require("sdk/tabs");
const {viewFor} = require('sdk/view/core');
const {modelFor} = require('sdk/model/core');
const {getBrowserForTab, getTabForContentWindow} = require("sdk/tabs/utils");
const {Ci, Cu} = require("chrome");
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);

var progressListener = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]),
    onLocationChange: function(aProgress, aRequest, aURI) {
        var highLevel= modelFor(getTabForContentWindow(aProgress.DOMWindow));
        console.log("onLocationChange ", highLevel.url);
    }
};

tabs.on('open', function(newTab) {
    var lowLevel = viewFor(newTab);
    var browser = getBrowserForTab(lowLevel);
    browser.addProgressListener(progressListener);
});
不要忘记在卸载扩展时删除侦听器。选项卡侦听器会自动删除,但ProgressListeners不会自动删除

灵感来自

nsIWebProgressListener——我在这里使用了它:thx@Noitidart对于这样一个简单的任务来说,这似乎太复杂了,但好吧,我已经定义了侦听器,我如何使用firefox插件sdk将其附加?我不能只做:gBrowser.addProgressListener(progListener);因为我没有访问gBrowser的权限,所以我尝试使用tab/utils并执行以下操作:
tabs.on('ready',function(tab){var browser=gBrowser.getBrowserForTab(tab);browser.addProgressListener(progListener);
但是浏览器是未定义的我对sdk不太熟悉。其复杂的原因是它提供了很多重要的信息,说明是什么导致了更改以及为什么。如果你只想监听更改,你可以使用一个变种观察者,使用
characterData
并观察匿名元素,否则它不会触发。我认为不会“观察员将在选项卡更改时断开连接,但我不确定。@TiagoSilva有几种为Firefox创建附加组件的方法。如果您只想要有关附加SDK的答案,那么以后不要使用
Firefox附加组件
标记。如果您想知道引导和附加SDK扩展之间的区别,请参阅。可能的duplica。”当然,请解释此代码回答问题的原因/方式。不鼓励只使用代码回答问题,因为它们不像使用解释的代码那么容易学习。如果没有解释,则需要花费相当多的时间和精力来理解正在做什么、对代码所做的更改、代码是否回答了问题等。对于试图从答案中学习的人和评估答案的人来说,解释都很重要,以确定答案是否有效或是否值得投票。我在问题中说:“url已更改,但没有新的页面加载或导航”,您的示例中没有一个:(涵盖我在切换选项卡、在新选项卡中打开页面、关闭选项卡、刷新页面和键入新URL之间所能想到的URL的所有更改。)涵盖我的示例:(如点击查看其他视频时的youtube)tabs.on(“ready”…在通过ajax获取新内容时不会触发,非常好且简单的解决方案,谢谢!不过,我们不必在每个打开的选项卡上都附加此侦听器。每个浏览器窗口仅附加一次。来源:此答案现在已过时。Firefox不推荐chrome API而支持WebExtensions。请注意,
progressListener
在这种情况下,不会在加载项关闭时删除。如果不在中手动删除它(
removeProgressListener()
),则会出现许多错误
TypeError:在禁用/卸载加载项后,直到Firefox重新启动,才能访问死对象。