Electron: 为什么不支持提示?

创建于 2014-07-09  ·  32评论  ·  资料来源: electron/electron

不支持prompt的原因是什么?

如何创建输入框?
我看到提示可能几乎像confirm

window.confirm = (message, title='') ->
  remote = require 'remote'
  dialog = remote.require 'dialog'
  buttons = ['OK', 'Cancel']
  not dialog.showMessageBox remote.getCurrentWindow(), {message, title, buttons}
statuwontfix 🚫

最有用的评论

我的两分钱:Electron 本身实现alertconfirm而不是prompt是没有意义的。

所有32条评论

提示在从用户输入数据时阻塞线程,所以我想这是主要原因。

alertconfirm以及使用dialog api制作的任何对话框相同。 我不认为这是一个原因,有时这种阻止是必要的(比如当有人选择要打开的文件时)。

想知道旨在替换核心对话框的vex库是否可以规避该限制会很有趣。

大多数 GUI 工具包中没有原生的prompt对话框,因此在 atom-shell 中实现prompt需要在所有平台上从头开始编写prompt对话框。 由于很少使用prompt ,我认为它不值得做所有的工作,并且很容易为此使用网络实现的解决方案。

所以我要关闭它,因为它无法解决。

+1 和相关: https ://github.com/atom/electron/issues/4134

似乎至少在 OS X 上,支持类似提示的对话框并不难,因为 Transmission 做到了:

screen shot 2016-03-02 at 4 24 05 pm

我使用预加载和同步 IPC 调用制作了一个与浏览器window.prompt一样工作的软件。 在这里查看。 它可以使用一些样式,但你明白了。 (是我的更改。)

var name = prompt('What is your name?', 'David')

prompt

这看起来像是窗口中的“假”提示,但它是一个单独的阻塞同步窗口,就像提示一样。

查看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 本身实现alertconfirm而不是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 :
您在此页面上有示例,我制作了一个简单的代码笔来演示使用:

https://codepen.io/gabrielstuff/pen/YoqvBr

但是我会使用提示来阻止 IO,如果像这样编译的循环,我的应用程序会收到它解释的代码。

while (i < n) {
  let a = read('Something message')
  ...
}

Block io 对我来说是完美的,使用 promise api 代码会有些痛苦。

你好@jefer94 ,我想这个简单的例子可能会让你感兴趣,它是非阻塞的并且允许递归地显示模式提示:

https://codepen.io/gabrielstuff/pen/ewZjNJ

不得不解决这个问题的公共回购的数量是疯狂的。

虽然prompt()不是从用户那里获取输入的最优雅的方式是有道理的,但它是人们在其网站上经常使用的非过时的浏览器 API。

@beakerbrowser@maidsafe这样的人以及任何使用 Electron 加载网页的人都会为访客页面提供最合理的浏览器 API( alertconfirm甚至HTMLMarqueeElement也可以),除了这个奇怪的省略。

所以,如果只是为了支持访客内容用例,我希望你重新考虑不支持提示。

@gabrielstuff

https://codepen.io/gabrielstuff/pen/YoqvBr

嘿,非常感谢,这正在工作! 它是目前最好的解决方法。

但我同意上面提到的所有其他帖子,即内置提示功能由 Electron 实现将非常有用。

由于对话框工作正常并且完全可定制,我不明白您为什么需要提示。

如果您只想使用快捷方式,有很多库为用户输入提供 JS 解决方案,并且与框架无关。

享受本机对话:)

对于任何真正想要在他们的 Electron 应用程序中使用本机提示窗口的人,我已经编写了这个库。 它并不完美,但它可以完成工作。

我们用这个
https://sweetalert2.github.io/
它适用于电子和应用程序的 pwa 版本

谢谢@konsumer ! 发表 4 年后仍然是一个很好的解决方案。

此页面是否有帮助?
0 / 5 - 0 等级