我正在创建一个Firefox插件,用于记录用户在浏览器中打开网页的时间。
我能够通过添加进度监听器来捕获浏览器中每个新网页的链接(包括新标签或已打开的网页):
addProgressListener(myAddon_urlBarListener,
Components.interfaces.nsIWebProgress.NOTIFY_ALL);
然后我使用onLocationChange
获取标签的新网址。
问题是我不知道标签的旧URL能够停止计时器并计算该网页的持续时间。现在我只能计算时间,如果我关闭网页的标签,因为我能够捕捉关闭标签事件以及关闭前页面中的链接。
如果我在同一个标签页面中打开一个新网址,我需要一种方法来捕获旧网页的网址,即使在浏览器中打开了多个标签页,也需要这样做。顺便说一句,我不是在使用jQuery,但如果需要,我会的。
答案 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>
元素。