0

ユーザーがブラウザーで Web ページを開いたままにしておく時間をログに記録する Firefox アドオンを作成しています。

プログレスリスナーを追加することで、ブラウザーで開いているすべての新しい Web ページ (新しいタブまたは既に開いているタブの両方) のリンクをキャッチできました。

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

次にonLocationChange、タブの新しい URL を取得するために使用します。

問題は、タイマーを停止し、その Web ページの期間を計算できるタブの古い URL がわからないことです。現在、タブを閉じるイベントとページ内のリンクを閉じる前にキャッチできるため、Webページのタブを閉じた場合にのみ時間を計算できます。

同じタブで新しい URL を開いた場合に古い Web ページの URL をキャッチする方法が必要です。これは、ブラウザーで複数のタブが開かれている場合でも機能する必要があります。ところで、私は jQuery を使用していませんが、必要に応じて使用します。

4

1 に答える 1

0

同じ URL が 2 つのタブで開かれている場合はどうなりますか? 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 に答える