如何在更改多标签浏览器中的选项卡之前捕获旧URL?

时间:2012-09-15 01:45:42

标签: javascript firefox firefox-addon

我正在创建一个Firefox插件,用于记录用户在浏览器中打开网页的时间。

我能够通过添加进度监听器来捕获浏览器中每个新网页的链接(包括新标签或已打开的网页):

addProgressListener(myAddon_urlBarListener,
                    Components.interfaces.nsIWebProgress.NOTIFY_ALL);

然后我使用onLocationChange获取标签的新网址。

问题是我不知道标签的旧URL能够停止计时器并计算该网页的持续时间。现在我只能计算时间,如果我关闭网页的标签,因为我能够捕捉关闭标签事件以及关闭前页面中的链接。

如果我在同一个标​​签页面中打开一个新网址,我需要一种方法来捕获旧网页的网址,即使在浏览器中打开了多个标签页,也需要这样做。顺便说一句,我不是在使用jQuery,但如果需要,我会的。

1 个答案:

答案 0 :(得分:0)

如果在两个标签中打开相同的网址,该怎么办?您应该关注标签,而不是网址。您的onLocationChange函数应找到与该标签关联的<browser>元素,并记住其URL(只要时间)。下次看到相同的<browser>元素时,您将获得所需的所有信息。存储有关浏览器的数据的最佳方式是WeakMap,使用tabbrowser.getBrowserForDocument() method可以找到<browser>元素。所以这样的事情应该有效:

browsers: new WeakMap(),

onLocationChanged: function(webProgress, request, location, flags)
{
  if (typeof flags == "number" &&
      (flags & Components.interfaces.nsWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT))
  {
    // Ignore anchor changes
    return;
  }

  var doc = webProgress.DOMWindow.document;
  var browser = gBrowser.getBrowserForDocument(doc);
  if (this.browsers.has(browser))
  {
    // We know this tab already, record data for previous URL
    var data = this.browsers.get(browser);
    recordPageClosed(data.url, data.startTime);
  }

  // Start timer for this tab
  this.browsers.set(browser, {url: location.spec, startTime: Date.now()});
}

当然,你仍然需要处理TabClose事件。在那里,您需要tabbrowser.getBrowserForTab() method才能通过相应的<browser>元素找到<tab>元素。