访问用户当前从扩展程序查看的每个文档

时间:2011-07-04 17:55:35

标签: events javascript-events event-handling firefox-addon

我正在编写一个扩展,用于检查用户在某些数据结构上查看的每个文档,执行一些后端服务器调用并将结果显示为对话框。问题是启动并使用事件侦听器正确地继续执行序列。我的实际想法是:

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。我也尝试过听焦点事件。

如果某人有替代解决方案如何访问用户当前正在查看的页面,我也会觉得很舒服。

2 个答案:

答案 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让我朝着正确的方向前进,我想如果你需要一个更复杂的事件,那么选择他的方式与进度听众一起。