6

Ich habe ein Inhaltsskript welches mal wie lange ein User eine Seite anschaut. Um dies zu tun, injiziere ich ein Inhaltsskript in jede Seite, starte einen Timer und gebe dann eine Nachricht an das Add-on zurück, wenn das Ereignis onbeforeunload ausgelöst wird.Nachricht an Add-on aus Inhaltsskript onbeforeunload senden?

Die Nachricht scheint jedoch nie an das Hintergrundskript übergeben zu werden.

Da meine main.js wie folgt aussieht:

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

ich eine Nachricht an main.js mit dem folgenden Code kein Problem senden.

Ich laufe auf ein Problem, wenn ich versuche, es zu tun, wie der Benutzer jedoch die Seite verlässt. Die Nachricht wird nie erhalten, wenn ich es wie folgt tun:

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

Ich habe versucht, für beforeunload hören zu, die funktioniert auch nicht. Was könnte das Problem sein?

+0

Binden Sie die 'onbeforeunload' nach dem Dokument bereit? Zweitens, hast du versucht, die Veranstaltung direkt anzuhängen? 'window.onbeforeunload = Funktion (e) { self.port.emit ('pageView', {visitTime: time}); // Dies sollte verhindern, dass der Benutzer einen Dialog sehen kann. Rückgabe undefiniert; }; 'In jsfiddle binding das 'onbeforeunload' mit jQuery funktioniert nicht, der direkte Weg funktioniert –

+0

Ich bin mir ziemlich sicher, dass ich den direkten Weg (die Frage vor ein paar Tagen) versucht habe, aber ich werde es erneut versuchen und komm zurück zu dir. Die Bindung ist nach jQuery bereit, also sollte das in Ordnung sein. –

+0

[versuchen Sie diese Geige] (http://jsfiddle.net/CD6DV/1/) und setzen Sie die jquery und Javascript in anderer Reihenfolge. Wenn ich ein 'onbeforeunload' in jquery setze, sehe ich eine 100% ige Handhabung durch Javascript und keine Bearbeitung durch jQuery. Wenn 'beforeunload' in jQuery verwendet wird, sehe ich intermittierendes Verhalten. Daher denke ich, dass Javascript das stabilste ist. Eine andere Sache, in die Sie springen können: Nicht alles Code scheint ausgeführt zu werden. Versuchen Sie, "alert (" something ");' im Code hinzuzufügen, und Sie werden nicht sehen, dass es ausgeführt wird. Wenn Sie den 'return undefined' durch einen String ersetzen, sollten Sie zumindest einen Dialog sehen, um zu bestätigen, dass die Seite –

Antwort

2

Das window Objekt, das Content-Skripts in Firefox-Browser-Add-Ons zugreifen, ist ein Proxy-Objekt und kann ein wenig temperamentvoll sein. Die Verwendung von window.addEventListener funktioniert.

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

Das OnbeforeUnload-Ereignis ist nicht synchronous, so dass der Browser-Müll sammelt die Seite, bevor es abgeschlossen ist. Verwenden, um eine 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 oder als Alternative.

Verwandte Themen