弹出 window.alert() 后无法编辑输入文本框

20

我有一个使用NodeJS、Bootstrap和AngularJS的Electron应用程序,其中包含一些可编辑的文本输入字段。 我有一个按钮可以触发window.alert()。 在触发之后,这些文本输入字段将无法再进行编辑。

单击该应用程序的其他元素不会改变这种情况。

单击另一个应用程序,然后返回该应用程序可以解决问题。 还可以通过使用Chrome检查器单击其中一个文本输入字段来解决问题。

这些是我的输入字段的一些CSS属性。

element.style {
}
.form-control:focus {
    color: #495057;
    background-color: #fff;
    border-color: #80bdff;
    outline: 0;
    box-shadow: 0 0 0 0.2rem rgba(0,123,255,.25);
}
.form-control {
    background-color: inherit;
    position: relative;
    z-index: 10;
}
*:focus {
    outline: 0;
}
.form-control {
    display: block;
    width: 100%;
    height: calc(2.25rem + 2px);
    padding: .375rem .75rem;
    font-size: 1rem;
    line-height: 1.5;
    color: #495057;
    background-color: #fff;
    background-clip: padding-box;
    border: 1px solid #ced4da;
    border-radius: .25rem;
    transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out;
}
*, ::after, ::before {
    box-sizing: border-box;
}
input:focus, textarea:focus, select:focus {
    outline-offset: -2px;
}
:focus {
    outline: -webkit-focus-ring-color auto 5px;
}
input {
    padding: 1px 0px;
}
input {
    -webkit-appearance: textfield;
    background-color: white;
    -webkit-rtl-ordering: logical;
    cursor: text;
    padding: 1px;
    border-width: 2px;
    border-style: inset;
    border-color: initial;
    border-image: initial;
}
input, textarea, select, button {
    text-rendering: auto;
    color: initial;
    letter-spacing: normal;
    word-spacing: normal;
    text-transform: none;
    text-indent: 0px;
    text-shadow: none;
    display: inline-block;
    text-align: start;
    margin: 0em;
    font: 400 13.3333px Arial;
}
input, textarea, select, button, meter, progress {
    -webkit-writing-mode: horizontal-tb !important;
}
html {
    font-family: sans-serif;
    line-height: 1.15;
    -webkit-text-size-adjust: 100%;
    -ms-text-size-adjust: 100%;
    -ms-overflow-style: scrollbar;
    -webkit-tap-highlight-color: transparent;
}
*, ::after, ::before {
    box-sizing: border-box;
}
*, ::after, ::before {
    box-sizing: border-box;
}

这是警告的代码。

电子弹出窗口 elerem.dialog.showMessageBox(elerem.getCurrentWindow(), options)并没有引起问题,只有 window.alert("你的设置列表已经更新");

req.on("end", function () {
    res = Buffer.concat(chunks).toString('utf8');
    $scope.checkingForUpdate = false;
    $scope.$apply();
    if (res == fs.readFileSync(CONFIG_FILE_PATH, 'utf8')) {
        window.alert("Your settings list is up to date");
    } else {
        let options = {
            buttons: ["Yes", "No"],
            message: "An updated settings list is available would you like to get it ? (You'll loose all unsaved settings)"
        }
        let response = elerem.dialog.showMessageBox(elerem.getCurrentWindow(), options)
        if (response == 0) {
            $scope.refresh = true;
            config.writeToFile(res, CONFIG_FILE_PATH, function (err) {
                if (err) {
                    window.console.log(err);
                } else {
                    window.alert("Your settings list has been updated with success");
                }
            });
        }
    }
    if ($scope.refresh) {
        config.init();
        $scope.$apply();
    }
});

我希望message.alert()不会改变我的文本输入框的行为。


我看到你把这标记为 JavaScript 问题,但是没有列出任何代码 - alert 是否还修改页面,例如将 alert 变成模态框? - MikeB
3个回答

34
根据这篇关于StackOverflow的帖子,由于执行时会冻结线程,因此electron不支持alert。尽管您可能能够调用它,但如果可能的话,建议改用electron的dialog或页面中的模态框(如MaterialUI或Bootstrap模态框)。

7
我想补充一点, confirm 似乎也会出现同样的问题。 - nantoni

2
我有点晚了,但我也遇到了window.alert()的困难。我不知道它也不受支持,所以我设置了一种使用electron的对话框发送消息的方式,如上所述。我想分享一下,以防其他人也遇到困难。
我完成这个任务的方法是使用preload.js文件。reZach在此线程中有一个关于preload.js和ipcRenderer的很好的帖子。
以下是我如何使用它来设置我的应用程序警报。
//In preload.js

const {ipcRenderer, contextBridge} = require('electron');

contextBridge.exposeInMainWorld(
    "api" : {
        messageMain: (channel, message) => {
            let validChannels = ['send-alert'];
            if (validChannels.includes(channel)) {
                 ipcRenderer.send(channel, message);
            }
        }
    }
)


//In main.js

//BrowserWindow Setup
let mainWindow;

function createWindow(){
    let win = new BrowserWindow({
        show: false,
        webPreferences: {
            nodeIntegration: false,
            contextIsolation: true,
            enableRemoteModule: false,
            preload: __dirname + '/preload.js'
        }
    })

    //load file/URL here 

    win.once("ready-to-show", () => {
        win.show()
    }

}


//ipcMain listener

ipcMain.on("send-alert", (event, incomingMessage) => {
    const options = {
        type: "none",
        buttons: ["Okay"],
        title: "Alert Message!"
        message: incomingMessage
    }
    dialog.showMessageBox(mainWindow, options)
})

app.on('ready', () => {
    mainWindow = createWindow()
}

//In ipcRenderer

window.api.messageMain("send-alert","Write your alert message here!")


0

就像 @Grim1101 上面提到的那样,使用 electron 的 dialog 而不是 alert()。例如,如果您想显示带有标题和内容的错误消息,可以使用 dialog.showErrorBox(title, content)

{dialog} = require('electron').remote

dialog.showErrorBox('title here','type error message here');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接