我有一个Chrome扩展程序,用于侦听页面上的更新。 onUpdated方法在页面上进行任何更改后调用侦听器。 如果添加或删除DOM节点>,则会调用侦听器。更新:似乎在加载请求后调用它。
我开始将此扩展程序移植到Firefox,到目前为止我找不到类似的功能。我想我可能需要深入研究XPCOM。
有人能指出我正确的方向吗? Firefox提供类似的东西吗?
谢谢!
答案 0 :(得分:6)
如果您已经有Chrome扩展程序,那么当您尝试将其移植到Firefox附加组件时,绝对应该查看Addon SDK(这是编写Firefox附加组件的“新”方式,反对写XUL / XPCOM)。此SDK提供了您在其他扩展平台中找到的大多数“标准扩展功能”。
我对你的问题的表达方式感到有些困惑。你的标题非常明确:你正在寻找相当于chrome.tabs.onUpdated
的标题。但是,在您的问题的正文中,您暗示此事件以某种方式用于检测何时添加/删除DOM节点。这是错误的。
Add-on SDK中没有一个与chrome.tabs.onUpdated
等效的内容:
Tab
instance)。这些事件只能在附加组件的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() {}
};
然后在窗口加载
上添加tabProgressListenervar gBrowser = document.getElementById('content');
gBrowser.addTabsProgressListener(tabProgressListener);
最后,请记住删除进度监听器
gBrowser.removeTabsProgressListener(tabProgressListener);
请注意,虽然我不是addon-sdk的粉丝,但编写sdk扩展名比引导它更容易。
答案 2 :(得分:1)
不幸的是,您需要等到标签准备好访问该URL。因此,使用Add-on SDK,它的简化版本(仅适用于活动选项卡)将是:
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) …