0

我正在制作一个 Firefox 插件,它将记录用户在其浏览器中保持网页打开的时间。

通过添加进度侦听器,我能够捕获在浏览器中打开的每个新网页的链接(无论是在新选项卡中还是在已打开的选项卡中):

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

然后我onLocationChange用来获取标签的新 URL。

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

如果我在同一个选项卡中打开一个新 URL,我需要一种方法来捕获旧网页的 URL,即使在浏览器中打开了多个选项卡,这也需要工作。顺便说一句,我没有使用 jQuery,但如果需要,我会的。

4

1 回答 1

0

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

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()方法<browser><tab>

于 2012-09-15T13:08:53.833 回答