在 Firefox 附加组件中检测选项卡 URL 更改
Detect tab URL change inside a Firefox add-on
我有一个在 Chrome 上运行的扩展程序,它监视活动选项卡的 URL 更改。
具体来说,我需要检测 URL 何时更改,但没有新的页面加载或导航。有些网站会这样做(例如,当您点击观看 YouTube 上的另一个视频时)。
在 Chrome,我完成了这个:
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo && changeInfo.status == "complete") {
//do stuff here
}
});
如何检测 Firefox 附加组件中的此类更改?
有人告诉我使用:Listening to events on all tabs,但我无法将其组合在一起。问题之一是 gBrowser
未在扩展中定义。
我做错了什么?
有没有更简单的方法?
如果您使用的是附加 SDK,那么您正在查看错误的文档。这是 tab docs.
如那里所述,您可以像这样创建一个侦听器:
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);
});
您查看的所有文档应该是 developer.mozilla.org/en-US/Add-ons/SDK.
的子集
我发现 activate
和 pageshow
这两个事件涵盖了 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 不会。
我有一个在 Chrome 上运行的扩展程序,它监视活动选项卡的 URL 更改。
具体来说,我需要检测 URL 何时更改,但没有新的页面加载或导航。有些网站会这样做(例如,当您点击观看 YouTube 上的另一个视频时)。
在 Chrome,我完成了这个:
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo && changeInfo.status == "complete") {
//do stuff here
}
});
如何检测 Firefox 附加组件中的此类更改?
有人告诉我使用:Listening to events on all tabs,但我无法将其组合在一起。问题之一是 gBrowser
未在扩展中定义。
我做错了什么?
有没有更简单的方法?
如果您使用的是附加 SDK,那么您正在查看错误的文档。这是 tab docs.
如那里所述,您可以像这样创建一个侦听器:
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);
});
您查看的所有文档应该是 developer.mozilla.org/en-US/Add-ons/SDK.
的子集我发现 activate
和 pageshow
这两个事件涵盖了 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 不会。