【发布时间】:2021-03-20 02:58:53
【问题描述】:
有没有办法像alert、confirm 和prompt(简称:“acp”)那样故意冻结浏览器窗口?
我想显示一个带有自定义 css 的模态对话框,而不是“acp”的本机弹出窗口,但也希望能够冻结浏览器,直到我有用户反馈,就像“acp”一样。
但是,伙计,为什么?这是不好的做法(呃,我必须投反对票)!
因此,如果这是不好的做法 - 那么为什么“acp”实际上提供了这种同步行为? 因为在某些特定场景中,它恰好是适合 UX 的正确工具。那些原生模式看起来确实很丑,同时也非常有限。
这只是一个快速而肮脏的例子,在用户给出反馈之前冻结浏览器是完全可以的。假设我们有一个 form 和一个 input[type="reset"] 元素。因此,在我们真正让form 重置之前,我们会询问用户类似的问题:“您确定要重置(数据会丢失)吗?”。
如果我对本机模态外观(我不是)感到满意,我可以这样做:
var handleSubmit = function( e ) {
confirm('Are you sure you want to reset (data will be lost)?') || e.preventDefault()
};
$('form').on( 'reset', handleSubmit ); // just using jQuery here for the sake of shortness
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
<input placeholder="type something, reset and cancel to keep input value" style="width:100%">
<input type="reset">
</form>
所以“每个人”都应该同意(编辑:或者至少有人可以)这不是坏习惯,对吧?
但是我们如何使用自定义样式的模态/对话框/弹出窗口来实现相同的效果呢?
我 - 当然 - 不是要求 HTML/CSS 部分,而是要求通过 JavaScript 冻结浏览器窗口的能力!
老实说,我实际上希望有人对此投反对票,但也许有一个 Killer JavaScript Ninja,他有这个特殊的 hack 使其成为可能...
注意:我确切地知道如何最终获得相同的结果,但我正在寻找一个实际的冻结/同步功能,以保持代码直截了当,减少 hack-ish。
【问题讨论】:
-
所以“每个人”都应该同意这不是坏习惯,对吧?不,不,我不知道。仅仅因为旧的本机方法冻结了浏览器,并不意味着您的逻辑应该如此。阻止用户与页面交互并不意味着您必须冻结浏览器。覆盖的整个概念就是为了这个目的而存在的。
-
你不能,但你可以让它看起来像你有。例如,如果您查看 Bootstrap 模态。 getbootstrap.com/docs/4.0/components/modal 在您的示例中,不使用重置按钮,而是显示您的模式,然后手动调用表单上的重置。
-
“那么,如果这是不好的做法 - 那么为什么“acp”实际上提供了这种同步行为?因为在某些特定场景中,它恰好是适合 UX 的正确工具。” i> 我从来没有见过一个 UXer 支持冻结浏览器和删除用户控制作为一种积极的体验。
-
不确定你想要什么答案,。这是不可能的。主要原因是如果你冻结浏览器,你认为什么会渲染 UI,你刚刚阻塞了浏览器的事件循环,它将无法处理来自用户的任何输入。同步方法确实感觉不错,但如果你使用
async / await,你可以使用const sure = await showConfirm();,它所需要的只是你的确认对话框成为一个承诺。 -
是的,这就是我说你手动调用它的原因。反正我就是这样做的,似乎并没有让代码变得更复杂,特别是如果你的人引用
quite experinced..
标签: javascript browser window synchronous