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

内容脚本在 Firefox 浏览器加载项中访问的window对象是代理对象,可能有点喜怒无常。使用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 回答