提示在从用户输入数据时阻塞线程,所以我想这是主要原因。
与alert
和confirm
以及使用dialog api制作的任何对话框相同。 我不认为这是一个原因,有时这种阻止是必要的(比如当有人选择要打开的文件时)。
想知道旨在替换核心对话框的vex库是否可以规避该限制会很有趣。
大多数 GUI 工具包中没有原生的prompt
对话框,因此在 atom-shell 中实现prompt
需要在所有平台上从头开始编写prompt
对话框。 由于很少使用prompt
,我认为它不值得做所有的工作,并且很容易为此使用网络实现的解决方案。
所以我要关闭它,因为它无法解决。
+1 和相关: https ://github.com/atom/electron/issues/4134
似乎至少在 OS X 上,支持类似提示的对话框并不难,因为 Transmission 做到了:
这看起来像是窗口中的“假”提示,但它是一个单独的阻塞同步窗口,就像提示一样。
查看https://github.com/jameskyburz/dialogs作为可能的解决方案。
那些是假的,因为它在窗户里面。 如果是的话,我的在外面。
你好,请问有什么办法可以解决这个问题吗?
对于那些考虑@JamesKyburz链接的人来说,仅供参考,Github 页面指出解决方案是not allowed in electron and some chrome extention contexts
。
编辑:没关系,误读了文档。 感谢@JamesKyburz 的更正。
@noahbengam
不, https://github.com/jameskyburz/dialogs是响应警报、提示、确认并不总是可用的修复程序。
从自述文件:
这些原生对应物阻塞了 UI 线程,在电子和一些 chrome 扩展上下文中是不允许的。
我不明白为什么 prompt 不是支持者,而 alert 是! 这两个阻塞线程并等待用户操作。。我认为提示是一个非常有用的功能,它应该在电子上实现。因为现在,它们不是简单的方法!
我上面的代码是同步的,就像提示符(单独的窗口)一样工作,但你可以随意设置它的样式。 这绝对是一个 hack,但我将它与依赖于提示的现有代码一起使用。
我的两分钱:Electron 本身实现alert
和confirm
而不是prompt
是没有意义的。
每次我在 Electron 中发现一个随机但必不可少的“不愿意修复”的问题时,“Adobe Air”这个词就会在我混乱的大脑中浮现。 让我们重新发明一个坏掉的轮子。
我没有拒绝在 Electron 中实现这一点,并迫使人们诉诸像这样的可怕黑客。 即使在大多数操作系统上它不是一个常见的对话框,它仍然很容易回退到 Chromium 的内置prompt()
对话框,我敢打赌这就是大多数人所需要的。 它基本上是 Electron 中的 4 行干净代码,而不是客户端中的 hacky 代码页面。
但是我会使用提示来阻止 IO,如果像这样编译的循环,我的应用程序会收到它解释的代码。
while (i < n) {
let a = read('Something message')
...
}
Block io 对我来说是完美的,使用 promise api 代码会有些痛苦。
当您因第三方库而需要解决方案时, @konsumer的解决方案效果很好。
干得好@konsumer 。
如果您想要 OS X 样式的对话框,请查看我的解决方案: electron-osx-prompt 。
它只是一个基于photonkit的带有一些 OS X 样式的原生 BrowserWindow(作为模态)。
只是想补充一点,对我来说,它也不支持是没有意义的。
我找到了这个解决方法
https://www.npmjs.com/package/electron-prompt
不确定这是否是最好的方法
大多数 GUI 工具包中没有本机提示对话框,因此在 atom-shell 中实现提示需要在所有平台上从头开始编写提示对话框。
在我看来,走这条路比强迫每个电子程序员重新发明轮子更有意义。
你好,
对于那些想要简单提示且没有第三方库的人,我发现使用原生 HTML5 对话框很好,并且可以完全自定义以匹配 Linux、Windows 和 Mac,因为它是无渲染的(没有特定的 CSS,做你想做的!):
<button id="openBtn">🎉 Open Modal</button>
<dialog id="modal" ref="imagePrompt">
<form method="dialog">
<h2>🛎Some question</h2>
<input id="modalInputVal" type="text" placeholder="type something" required>
<button type="submit" value="no" formnovalidate>
Cancel
</button>
<button type="submit" value="yes">
Confirm
</button>
</form>
</dialog>
对于js
部分:
let openModalButton = document.querySelector('#openBtn')
let modal = document.querySelector('#modal')
let modalInputValue = modal.querySelector('#modalInputVal')
function openModal() {
modal.showModal()
}
function logInput(answer) {
console.log(typeof answer)
if(answer === 'yes') {
window.alert(modalInputValue.value)
} else {
window.alert('user cancel')
}
modalInputValue.value = modal.returnValue = ''
}
openModalButton.addEventListener('click', openModal)
modal.addEventListener('close', () => logInput(modal.returnValue))
您可以在此处阅读更多内容: https :
您在此页面上有示例,我制作了一个简单的代码笔来演示使用:
但是我会使用提示来阻止 IO,如果像这样编译的循环,我的应用程序会收到它解释的代码。
while (i < n) { let a = read('Something message') ... }
Block io 对我来说是完美的,使用 promise api 代码会有些痛苦。
你好@jefer94 ,我想这个简单的例子可能会让你感兴趣,它是非阻塞的并且允许递归地显示模式提示:
不得不解决这个问题的公共回购的数量是疯狂的。
虽然prompt()
不是从用户那里获取输入的最优雅的方式是有道理的,但它是人们在其网站上经常使用的非过时的浏览器 API。
像@beakerbrowser和@maidsafe这样的人以及任何使用 Electron 加载网页的人都会为访客页面提供最合理的浏览器 API( alert
、 confirm
甚至HTMLMarqueeElement
也可以),除了这个奇怪的省略。
所以,如果只是为了支持访客内容用例,我希望你重新考虑不支持提示。
@gabrielstuff
嘿,非常感谢,这正在工作! 它是目前最好的解决方法。
但我同意上面提到的所有其他帖子,即内置提示功能由 Electron 实现将非常有用。
由于对话框工作正常并且完全可定制,我不明白您为什么需要提示。
如果您只想使用快捷方式,有很多库为用户输入提供 JS 解决方案,并且与框架无关。
享受本机对话:)
对于任何真正想要在他们的 Electron 应用程序中使用本机提示窗口的人,我已经编写了这个库。 它并不完美,但它可以完成工作。
我们用这个
https://sweetalert2.github.io/
它适用于电子和应用程序的 pwa 版本
谢谢@konsumer ! 发表 4 年后仍然是一个很好的解决方案。
最有用的评论
我的两分钱:Electron 本身实现
alert
和confirm
而不是prompt
是没有意义的。