如果地址栏中的URL(也称为位置栏)发生更改,如何收到通知。使用以下代码,我试图在用户导航到另一个页面时(通过单击链接,使用后退/前进按钮,通过在位置栏中键入地址等)以及用户切换选项卡时收到通知。
var myExtension = {
oldURL: null,
init: function() {
gBrowser.addProgressListener(this);
},
uninit: function() {
gBrowser.removeProgressListener(this);
},
processNewURL: function(aURI) {
if (aURI.spec == this.oldURL) return;
// now we know the url is new...
alert(aURI.spec);
this.oldURL = aURI.spec;
},
// nsIWebProgressListener
QueryInterface: XPCOMUtils.generateQI(["nsIWebProgressListener",
"nsISupportsWeakReference"]),
onLocationChange: function(aProgress, aRequest, aURI) {
this.processNewURL(aURI);
},
onStateChange: function() {},
onProgressChange: function() {},
onStatusChange: function() {},
onSecurityChange: function() {}
};
};
window.addEventListener("load", function() { myExtension.init() }, false);
window.addEventListener("unload", function() { myExtension.uninit() }, false);
但是此代码正在获取XPCOMUtils和window的引用错误。我正在firefox附加构建器上开发此代码。有什么我需要导入???
答案 0 :(得分:1)
在文件开头添加此代码以导入XPCOMUtils.jsm
var {Cc, Ci, Cu} = require("chrome");
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
答案 1 :(得分:0)
嘿,我得到了我的问题的答案,但是点击事件我需要它在页面加载事件上工作 我尝试了document.addEventListener()但它没有工作
// This is an active module of the binitksingh (1) Add-on
const contextMenu = require("context-menu"),
data = require("self").data,
notify = require("simple-notify").notify,
tabs = require("tabs"),
widgets = require("widget");
exports.main = function(options, callbacks) {
// Add a one-click option to addons bar.
var widget = widgets.Widget({
id: "Show-url",
label: "Show URL",
contentURL: "http://www.example.com/favicon.ico",
onClick: function() {
var tabworker = tabs.activeTab.attach({
contentScriptFile: data.url('js/find-url.js'),
onMessage: processUrl
});
tabworker.port.emit('click');
},
});
}
function processUrl(url) {
if (url) {
notify("Hello now u r on:\n" + url);
} else {
notify('ZOMG, error finding URL.');
}
}
答案 2 :(得分:0)
在您的内容脚本中,您可以捕获hashchange和pageshow的事件。
当网站中的URL发生更改时,由于您没有离开页面的某种导航类型,会触发哈希更改事件。
当您向前导航时,PageShow将会触发。
否则,如果您是第一次访问某个页面,它应该是第一次附加您的脚本。您可以*.port.emit
返回主脚本。
根据您使用PageMod或仅在选项卡上附加工作程序可能会影响您使用这些事件的方式,此方法需要使用可访问dom的内容脚本。否则,您必须定期检查main.js中标签的url属性。