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过,那也不行:当我这样做,这是从来没有收到该消息。可能是什么问题呢?

+0

您是否在文档准备好后绑定'onbeforeunload'?其次,你是否尝试直接附加事件? 'window.onbeforeunload = function(e){self.port.emit('pageView',{visitTime:time}); //这应该会阻止用户看到对话框。 return undefined; };'在jsfiddle绑定的'onbeforeunload'与jQuery不起作用,直接的方式确实工作 –

+0

我很确定我尝试了直接的方式(前几天提出问题),但我会再试一次,尽快给您回复。绑定发生在jQuery准备就绪后,应该没问题。 –

+0

[试试这个小提琴](http://jsfiddle.net/CD6DV/1/)并把jquery和javascript按不同顺序排列。如果我在jquery中加入'onbeforeunload',我会看到100%的JavaScript处理和jQuery没有处理。如果在jQuery中使用'beforeunload',我会看到间歇性行为。所以我认为JavaScript是最稳定的。你可能会遇到的另一件事情:并不是所有的代码似乎都被执行了。尝试在代码中添加alert(“something”);并且不会看到它正在执行。如果你用一个字符串替换'return undefined',至少你应该看到一个对话框来确认离开页面 –

回答

2

内容脚本在Firefox浏览器加载项中访问的window对象是一个代理对象,可能有点令人费解。使用window.addEventListener将工作。

window.addEventListener('beforeunload', function(e) { 
    # Do stuff then return undefined so no dialog pops up. 
    return undefined 
}); 
1

onbeforeUnload事件不是synchronous,所以浏览器垃圾在完成之前收集页面。使用synchronous AJAX request

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 }); 
} 

return a string作为替代。

相关问题