[英]Google Chrome exstension 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
等效项:
Tab
实例的“ ready”事件 )。 这些事件只能在插件的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。 因此,使用附加软件开发工具包,它的简化版本(仅适用于活动选项卡)将是:
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.