我正在编写一个扩展,它检查用户在某些数据结构上查看的每个文档,执行一些后端服务器调用,并将结果显示为对话框。问题是使用事件侦听器正确地启动和继续序列。我的实际想法是:
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。我还试着听一些焦点事件。
如果有人有一个替代的解决方案,如何访问用户当前正在查看的页面,我也会觉得很舒服。
常见的方法是使用进度侦听器。如果我理解正确,您希望在浏览器选项卡加载完成时收到通知。因此,进度监听器中的重要方法是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);
}
},
好的,我从MDN文档中找到了一种工作方式,并实现了用户打开的每个文档都可以通过您的扩展访问。访问用户关注的每一个文档都太多了,我希望代码只执行一次。因此,我从初始化Exentsion开始,并侦听DOMContext加载的事件
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为我指明了正确的方向,我想如果您需要更复杂的事件侦听,请选择他与进度侦听器的方式。