6

ユーザーがページを表示する時間を計測するコンテンツ スクリプトがあります。onbeforeunloadこれを行うには、各ページにコンテンツ スクリプトを挿入し、タイマーを開始してから、イベントがトリガーされたときにアドオンにメッセージを送信します。

ただし、メッセージがバックグラウンド スクリプトに渡されることはないようです。

main.jsがこのように見えるとすれば:

var pageMod = require('page-mod'),
    self = require("self");

pageMod.PageMod({
  include: "http://*",
  contentScriptFile: [self.data.url('jquery.min.js'),
                      self.data.url('content.js')],
  onAttach: function(worker) {
    worker.port.on('pageView', function(request) {
      console.log("Request received");
    });
  }
});

main.js次のコードを使用して問題なくメッセージを送信できます。

self.port.emit('pageView', { visitTime: time });

ただし、ユーザーがページを離れたときにそれを実行しようとすると、問題が発生します。次のようにすると、メッセージが受信されません。

$(window).bind('onbeforeunload', function(e) {
  self.port.emit('pageView', { visitTime: time });
  // This should prevent the user from seeing a dialog.
  return undefined;
});

私も聞いてみましたbeforeunloadが、それもうまくいきません。何が問題なのですか?

4

2 に答える 2

3

windowコンテンツ スクリプトが Firefox ブラウザー アドオンでアクセスするオブジェクトはプロキシ オブジェクトであり、少し気まぐれな場合があります。を使用window.addEventListenerすると動作します。

window.addEventListener('beforeunload', function(e) {
  # Do stuff then return undefined so no dialog pops up.
  return undefined
});
于 2012-10-26T00:26:22.943 に答える
1

onbeforeUnloadイベントは同期的ではないため、ブラウザのガベージはページが終了する前にページを収集します。同期AJAXリクエストを使用します:

function Data() 
 {
 var client = new XMLHttpRequest();
 client.open("GET", "/request", false); // third paramater indicates sync xhr
 client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
 client.send({ visitTime: time });
 client.onreadystatechange = emitter;
 }

function emitter()
 {
 self.port.emit('pageView', { visitTime: time });
 }

または、代わりに文字列を返します。

于 2012-08-29T17:12:26.530 に答える