2010-02-23 4 views
15

Ich schreibe eine Google Chrome-Erweiterung mit einem Popup und einer Hintergrundseite. Das Popup abonniert bestimmte Ereignisse, die der Hintergrund erzeugt, und ich möchte mich von diesen Ereignissen abmelden, wenn das Popup verschwindet. Ich sehe jedoch keine onbeforeunload- oder onunload-Ereignisse, die aus dem Popup generiert werden. Werden diese Ereignisse ausgelöst? Wenn nicht, irgendwelche Ideen, wie Popup zu schließen?Wird onbeforeunload Event-Trigger für popup.html in einer Google Chrome-Erweiterung?

+1

Ich habe diese genaue Frage. Hast du jemals eine Antwort gefunden? –

Antwort

1

Ich hatte eine Art ähnliches Problem. In meinem Fall habe ich den Fokus auf ein Element gesetzt, das in der Popup-Seite war. Also, wenn das Popup geschlossen ist, verliert das Element den Fokus und ich kann das Blur-Ereignis abfangen.

+0

Dieser Trick funktioniert nicht für mich - war wirklich hoffnungsvoll - aber nein. –

30

"beforeunload" ist nicht gefeuert für Browser Action Popups. Glaub mir, ich habe es versucht. "Entladen" sollte jedoch korrekt abgefeuert werden, hören Sie also zu.

Eigentlich habe ich ein ähnliches System an Ort und Stelle, die Sie Ereignisse mit addEventListener anhängen können, und sie werden automatisch aufgeräumt, wenn das Entladen Ereignis ausgelöst wird.

Hier ist ein kleiner Tipp: Natürlich können Sie console.log nicht verwenden, denn wenn das Entladeereignis ausgelöst wird, ist es bereits zu spät. Aber, können Sie dies tun:

var background = chrome.extension.getBackgroundPage(); 

addEventListener("unload", function (event) { 
    background.console.log(event.type); 
}, true); 

Durch den obigen Code verwenden, können Sie die Hintergrundseite der Konsole öffnen, die zeigen sollen, dass das Unload-Ereignis korrekt ausgelöst wird.

+0

Danke für die Hintergrundkonsole Tipp! Ziemlich nützlich! –

+0

@AlexStack Ich habe Ihre Bearbeitung rückgängig gemacht. 'chrome.runtime.getBackgroundPage' ist nicht äquivalent - es ist asynchron. – Xan

+0

Zumindest mit einer Event-Seite und der Verwendung von 'chrome.runtime.getBackgroundPage()', um einen Aufruf an die Hintergrundseite zu machen, um etwas zu loggen, sehe ich das nicht zum 'Entladen' von Ereignissen. – jdunning

0

Wenn Sie anstelle der Hintergrundseiten in Ihrer Nebenstelle auf geschaltet haben, ruft die empfohlene Methode zum Zugriff darauf chrome.runtime.getBackgroundPage() mit einer Funktion auf, die mit der Hintergrundseitenreferenz aufgerufen wird.

Wenn Sie jedoch versuchen, die Hintergrundseite in einem onbeforeunload Handler zu bekommen, wie folgt aus:

document.addEventListener("beforeunload", function() { 
    chrome.runtime.getBackgroundPage(function(backgroundPage) { 
     backgroundPage.log("unloading"); 
    }); 
}); 

Der Rückruf scheint nicht zu schießen, bevor die Seite entladen wird, so dass log() Anruf nie gemacht wird.

In einem Kommentar oben schlug Pauan vor, chrome.extension.getBackgroundPage() zu verwenden, um die Seite zu erhalten. Der einzige Weg, wie ich das erreichen konnte, war nicht den Handler mit addEventListener() zu erstellen. Stattdessen hatte ich alte Schule zu gehen und den Handler direkt auf window gesetzt:

window.onbeforeunload = function() { 
    chrome.extension.getBackgroundPage().log("unloading"); 
}; 

die schließlich durch Seite in den Hintergrund bekam.