我有一个内容脚本,用户浏览页面的时间长短。为此,我在每个页面中插入一个内容脚本,启动一个计时器,然后在触发事件时向附加组件发回消息。从内容脚本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
过,那也不行:当我这样做,这是从来没有收到该消息。可能是什么问题呢?
您是否在文档准备好后绑定'onbeforeunload'?其次,你是否尝试直接附加事件? 'window.onbeforeunload = function(e){self.port.emit('pageView',{visitTime:time}); //这应该会阻止用户看到对话框。 return undefined; };'在jsfiddle绑定的'onbeforeunload'与jQuery不起作用,直接的方式确实工作 –
我很确定我尝试了直接的方式(前几天提出问题),但我会再试一次,尽快给您回复。绑定发生在jQuery准备就绪后,应该没问题。 –
[试试这个小提琴](http://jsfiddle.net/CD6DV/1/)并把jquery和javascript按不同顺序排列。如果我在jquery中加入'onbeforeunload',我会看到100%的JavaScript处理和jQuery没有处理。如果在jQuery中使用'beforeunload',我会看到间歇性行为。所以我认为JavaScript是最稳定的。你可能会遇到的另一件事情:并不是所有的代码似乎都被执行了。尝试在代码中添加alert(“something”);并且不会看到它正在执行。如果你用一个字符串替换'return undefined',至少你应该看到一个对话框来确认离开页面 –