我正在编写一个扩展,用于检查用户在某些数据结构上查看的每个文档,执行一些后端服务器调用并将结果显示为对话框。问题是启动并使用事件侦听器正确地继续执行序列。我的实际想法是:
Load: function()
{
var Listener = function(){ Fabogore.Start();};
var ListenerTab = window.gBrowser.selectedTab;
ListenerTab.addEventListener("load",Listener,true);
}
(...)
ListenerTab.removeEventListener("load", Listener, true);
Fabogore.Load();
首先在浏览器打开时初始化Fabogore.Load函数。它只有在我获得这些数据结构后才能工作,但之后却没有。但理论上,脚本应该初始化一个新的监听器,所以也许它是selectedTab。我也尝试过听焦点事件。
如果某人有替代解决方案如何访问用户当前正在查看的页面,我也会觉得很舒服。
答案 0 :(得分:0)
常见的方法是使用progress listener。如果我理解正确,您希望在浏览器选项卡完成加载时收到通知。因此,进度监听器中的重要方法是onStateChange
(它还需要包含所有其他方法):
onStateChange: function(aWebProgress, aRequest, aFlag, aStatus)
{
if ((aFlag & Components.interfaces.nsIWebProgressListener.STATE_STOP) &&
(aFlag & Components.interfaces.nsIWebProgressListener.STATE_IS_WINDOW) &&
aWebProgress.DOMWindow == aWebProgress.DOMWindow.top)
{
// A window finished loading and it is the top-level frame in its tab
Fabogore.Start(aWebProgress.DOMWindow);
}
},
答案 1 :(得分:0)
好的,我发现了一种可以在MDN文档中运行的方法,并且可以实现扩展程序可以访问用户打开的每个文档。访问用户关注的每个文档太多了,我希望代码只执行一次。所以我首先初始化Exentsion,然后监听DOMcontentloaded Event
window.addEventListener("load", function() { Fabogore.init(); }, false);
var Fabogore = {
init: function() {
var appcontent = document.getElementById("appcontent"); // browser
if(appcontent)
appcontent.addEventListener("DOMContentLoaded", Fabogore.onPageLoad, true);
},
每次加载页面时都会执行代码。现在重要的是,您使用新加载的页面执行代码,而不是使用旧页面。您可以使用变量aEvent:
访问此变量onPageLoad: function(aEvent)
{
var doc = aEvent.originalTarget;//Document which initiated the event
使用变量“doc”,您可以使用XPCNativeWrapper等检查数据结构。感谢Wladimir让我朝着正确的方向前进,我想如果你需要一个更复杂的事件,那么选择他的方式与进度听众一起。