6

Tengo un script de contenido que mide el tiempo que un usuario ve una página. Para hacer esto, inserto un script de contenido en cada página, inicio un temporizador y luego emito un mensaje de nuevo al complemento cuando se desencadena el evento onbeforeunload.¿Emitir mensaje al add-on de la secuencia de comandos de contenido antes de la descarga?

Sin embargo, el mensaje nunca parece pasar al script de fondo.

Teniendo en cuenta que mi main.js se parece a esto:

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

me puede enviar un mensaje a main.js usando el siguiente código ningún problema.

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

Tengo un problema cuando intento hacerlo ya que el usuario se va de la página sin embargo. El mensaje no se recibe cuando lo hago de esta manera:

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

He intentado escuchar beforeunload también, que no funciona bien. ¿Cual podría ser el problema?

+0

¿Está vinculando el 'onbeforeunload' después de que el documento esté listo? En segundo lugar, ¿intentó adjuntar el evento directamente? 'window.onbeforeunload = function (e) { self.port.emit ('pageView', {visitTime: time}); // Esto debería evitar que el usuario vea un cuadro de diálogo. return undefined; }; 'En jsfiddle vinculando el' onbeforeunload' con jQuery no funciona, la forma directa funciona –

+0

Estoy bastante seguro de que lo intenté de manera directa (hice la pregunta hace unos días) pero intentaré de nuevo y Regresar a ti. La vinculación está sucediendo después de jQuery listo, así que debería estar bien. –

+0

[prueba este violín] (http://jsfiddle.net/CD6DV/1/) y pon el jquery y javascript en orden diferente. Si pongo 'onbeforeunload' en jquery veo que 100% se maneja mediante javascript y no se maneja con jQuery. Si 'beforeunload' se usa en jQuery, veo un comportamiento intermitente. Por lo tanto, creo que javascript es el más estable. Otra cosa en la que puede rebotar: no todo el código parece ejecutarse. Intente agregar 'alert (" something ");' en el código y no verá que se está ejecutando. Si reemplaza el 'return undefined' con una cadena, al menos debería ver un cuadro de diálogo para confirmar que salió de la página –

Respuesta

2

El objeto window al que acceden los scripts de contenido en los complementos del navegador Firefox es un objeto proxy y puede ser un poco temperamental. Usar window.addEventListener funcionará.

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

El evento onbeforeUnload no es synchronous, por lo que la basura del navegador recopila la página antes de que finalice. Use un 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 }); 
} 

o return a string como una alternativa.

Cuestiones relacionadas