2017-08-22 3 views
0

ich weiß, dass es Hunderte von Fragen wie: "Wie kann ich schließen Ereignis in Elektron" oder so ähnlich.
Nach der Implementierung einer Bestätigungsbox (Elektron Nachricht Box) im beforeunload Event konnte ich meine App schließen und das Close Event abbrechen. Da die Entwickler-Tools immer offen sind, habe ich nicht erkennen, dass es nicht funktioniert, während die Entwickler-Tools geschlossen sind ...Bestätigung vorunload in Elektron

window.onbeforeunload = e => 
{   
    // show a message box with "save", "don't save", and "cancel" button 
    let warning = remote.dialog.showMessageBox(...) 

    switch(warning) 
    { 
     case 0: 
      console.log("save"); 
      return; 
     case 1: 
      console.log("don't save"); 
      return; 
     case 2: 
      console.log("cancel"); 
      return false; 
      // e.returnValue = "false"; 
      // e.returnValue = false; 
    } 
}; 

Also, wenn die Entwickler-Tools geöffnet sind, kann ich die App schließen mit Speichern, ohne zu speichern und das Ereignis abzubrechen.
Wenn die Dev-Tools geschlossen sind, funktioniert der Cancel-Button nicht mehr.

Btw .:

window.onbeforeunload = e => 
{   
    return false; 
    alert("foo"); 
}; 

wird das unmittelbare Ereignis abbrechen und offensichtlich würde die Meldung nicht mehr anzeigen (spielt keine Rolle, ob Entwickler-Tools offen oder geschlossen sind)

window.onbeforeunload = e => 
{   
    alert("foo"); 
    return false; 
}; 

die annullieren Schließen Sie das Ereignis nach dem Drücken von OK, wenn die Dev-Tools geöffnet sind, und schließen Sie die App nach dem Drücken von OK, wenn die Dev-Tools geschlossen sind.

Absichtlich verwende ich die synchrone API des Meldungsfelds und whi le ich schreibe diese Frage ich fand heraus, dass eine App mit zwei Fenstern (new remote.BrowserWindow()) wird genau wie mit den Dev-Tools verhalten.

Hat jemand eine Idee, wie ich dieses Problem lösen kann?
Vielen Dank im Voraus

+0

Es sieht so aus, als ob Sie auf ein [bekanntes Problem in Electron] (https://github.com/electron/electron/issues/7977) stoßen. – FlyingPiMonster

Antwort

3

Statt onbeforeunload arbeitet lieber mit der Veranstaltung close. Von diesem Ereignis können Sie die Abschlussveranstaltung abfangen, bevor der gesamte Abschlussvorgang abgeschlossen ist (Ereignis closed). Mit close können Sie die Kontrolle übernehmen und anhalten, wann immer Sie die Schließung benötigen.

Dies ist möglich, wenn Sie Ihren Browser neu erstellen, vorzugsweise im Hauptprozess:

// Create the browser window. 
window = new BrowserWindow({}); 

// Event 'close' 
window.on('close', (e) => { 
    // Do your control here 
    if (bToStop) { 
     e.preventDefault(); 
    } 
} 

// Event 'closed' 
window.on('closed', (e) => { 
    // Fired only if you didn't run the line e.preventDefault(); above! 
} 

Darüber hinaus bewusst sein, dass die Funktion e.preventDefault() im gesamten Code verbreitet. Wenn Sie wieder auf das natürliche Verhalten von Electron zurückgreifen müssen, müssen Sie die Variable e.defaultPrevented auf false umschalten.

Eigentlich scheint e.preventDefault() Funktion ist die Variable e.defaultPrevented bis true bis jede Änderung daran.

+0

Danke @Jerome, jetzt höre ich das Close-Event im Hauptprozess und rufe 'e.preventDefault();' auf. Außerdem sendet der Hauptprozess ein Ereignis an den Renderer. Dort werde ich den Dialog zeigen und einige andere Dinge überprüfen. Wenn der Benutzer nicht auf Abbrechen klickt, verlasse ich die App, indem ich 'remote.app.exit();' aufrufe, damit der Dialog nicht wieder erscheint. – dkirchhof

+0

Ein großes Problem war, dass es mehrere verschiedene Ereignisse gibt, wie das Schließen der App ("x"/"exit" im Menü) oder das Neustarten ("neustart" im Menü oder Drücken von F5 in dev tools). Also konnte ich die Methode nicht anwenden, weil ich nicht wusste, welches Ereignis passiert ist. Jetzt habe ich die Neustart-Ereignisse entfernt (normalerweise würde der Benutzer die Dev-Tools sowieso nicht öffnen). – dkirchhof

+0

Nun, um dieses Problem zu vermeiden, habe ich den Zustand des Fensters bei jedem meiner Ereignisse verfolgt.Das Fortfahren auf diese Weise erlaubte mir zu wissen, ob das "Schließen" -Ereignis aufgrund meines Codes ausgelöst wurde (z. B. Ereignisse, Knöpfe, Funktionen ...) oder aufgrund des "X" -Knopfes des vom Benutzer gedrückten Fensters. Fühlen Sie sich frei, aktualisierten Code zur Verfügung zu stellen. – Jerome