2012-09-15 93 views
0

我正在制作一个Firefox插件,用于记录用户在浏览器中打开网页的时间。如何在更改多标签浏览器中的标签之前捕获旧URL?

我能够通过添加进度监听赶在浏览器中每一个新的网页打开的链接(无论是在新的标签或已经打开了一个):

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

然后我用onLocationChange得到标签的新网址。

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

我需要一种方法来赶上老网页的URL,如果我在同一个选项卡中打开一个新的URL,这需要即使不止一个标签页都在浏览器中打开工作。顺便说一句,我不使用jQuery,但如果它是必需的,我会的。

+0

如果你可以看到所有当前打开的选项卡,为什么不能比当前打开的选项卡的标签,你现在已经得救了吗?不在列表中的那个是被改变的那个。 –

+0

@sudowned:我用了弗拉基米尔的建议,对我来说工作得很好,thanx分享你的想法 – BlackSigma

回答

0

如果在两个选项卡中打开了相同的URL,该怎么办?你应该关注标签,而不是网址。您的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()}); 
} 

当然,你仍然必须处理​​事件。在那里你需要tabbrowser.getBrowserForTab() method来找到<browser>元素相应的<tab>元素。

相关问题