我正在构建一个使用浏览器overlay.xul的附加组件,其中包含了js文件。我发现在网页上修改HTML的最简单方法就是我在mdn上发现的这些代码。
const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START;
const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP;
var myListener = {
QueryInterface: function(aIID) {
if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
},
onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { },
onLocationChange: function(aProgress, aRequest, aURI) {
PageLoad.initialzed = false;
PageLoad.init();
},
onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) { },
onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) { },
onSecurityChange: function(aWebProgress, aRequest, aState) { }
};
gBrowser.addProgressListener(myListener);
var PageLoad = {
initialzed : false,
browser : null,
domain : null,
appcontent : null,
init : function() {
PageLoad.appcontent = document.getElementById("appcontent");
if (PageLoad.appcontent) {
PageLoad.appcontent.addEventListener("DOMContentLoaded", PageLoad.load, true);
}
},
load : function() {
//I do this so it only calls the function once
if (PageLoad.initialzed == false) {
PageLoad.initialzed = true;
PageLoad.browser = gBrowser.contentDocument;
PageLoad.domain = (PageLoad.browser.location.host.match(/([^.]+)\.\w{2,3}(?:\.\w{2})?$/) || [])[1];
myFunctiontoInsertHTML();
}
}
};
然后我可以在我的函数中使用PageLoad.browser.createElement('div')
等等。这到目前为止工作得很好但是我遇到了一个问题,即打开了多个标签,我的PageLoad.domain
变量包含了最后加载的标签页或网页(这会导致在2个或更多不同的页面/标签上插入html时出错)。所以我想改变的是每次用户点击不同的标签或重新加载我想调用该功能的页面,但我已经陷入了死胡同。
答案 0 :(得分:0)
gBrowser.contentDocument
是当前浏览器选项卡中加载的页面文档 - 只要用户切换选项卡或导航到其他页面,其值就会更改,您不应保留旧值(它是一个内存泄漏)。您正在观察所有浏览器选项卡的进度,您应该查看您要求的那个。在您的情况下的含义:aProgress.DOMWindow
(请参阅nsIWebProgress.DOMWindow)。如果您对单个选项卡的加载进度感兴趣,那么这也是您应该附加DOMContentLoaded
事件监听器的位置。