2017-08-22 115 views
0

我知道有幾百個問題:「我如何防止電子中的關閉事件」或類似的東西。
執行beforeunload事件中的確認框(電子消息框)後,我能夠關閉我的應用程序並取消關閉事件。由於開發工具始終是開放的,我並沒有認識到,雖然開發者工具關閉它不工作...確認電子之前未加載

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

所以,開發者工具打開時,我可以關閉與應用保存,不保存和取消事件。
當開發工具關閉時,取消按鈕不再有效。

順便說一句。:

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

將取消該關閉事件,顯然不會顯示消息(不要緊,如果開發工具的打開或關閉)

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

將取消關閉事件後按下確定如果開發工具打開,並關閉應用程序後按下確定如果開發工具已關閉

故意我使用消息框的同步api和whi我正在寫這個問題,我想出了一個兩個窗口的應用程序(new remote.BrowserWindow())將表現完全像開發工具。

有沒有人知道我能如何解決這個問題?
非常感謝提前

+0

它看起來像是遇到了[Electron中的已知問題](https://github.com/electron/electron/issues/7977)。 – FlyingPiMonster

回答

3

而不是onbeforeunload寧願與事件close合作。從這個事件中,您將能夠在整個關閉過程完成之前捕捉結束事件(事件closed)。通過close,您可以在需要完成關閉時控制並停止。

當您創建BrowserWindow,最好是在主要的過程這是可能的:

// 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! 
} 

此外,要注意功能e.preventDefault()在整個代碼正在蔓延。如果您需要回到Electron的自然行爲,則需要將變量e.defaultPrevented切換爲false

實際上,看起來e.preventDefault()函數正在處理變量e.defaultPreventedtrue,直到對它進行任何更改。

+0

感謝@Jerome,現在我在主進程中偵聽關閉事件並調用'e.preventDefault();'。另外,主進程向渲染器發送一個事件。在那裏我會顯示對話框並檢查其他的東西。如果用戶沒有點擊取消,我將通過調用'remote.app.exit();'退出應用程序,所以對話框不會再彈出。 – dkirchhof

+0

一個大問題是,有多個不同的事件,如關閉應用程序(菜單中的「x」/「exit」)或重新啓動它(菜單中的「重新啓動」或在開發工具中按F5)。所以我無法使用該方法,因爲我實際上並不知道發生了哪個事件。現在我刪除了重新啓動事件(通常用戶不會打開開發工具)。 – dkirchhof

+0

那麼,爲了避免這個問題,我正在跟蹤每個事件的窗口狀態。通過這種方式,我可以知道是否由於我的代碼(例如事件,按鈕,功能...)或由用戶按下的窗口的「X」按鈕而觸發了「close」事件。隨時提供更新的代碼。 – Jerome