是否有办法像alert
、confirm
和prompt
一样故意冻结浏览器窗口(简称“acp”)?
我想展示一个带有自定义css的模态对话框,而不是使用原生弹出框来实现“acp”,但我也想像“acp”一样能够冻结浏览器直到用户反馈。
但是,人们为什么认为这是不好的做法呢(嗯,我要downvote了)!那么,当这是不好的做法时 - 为什么“acp”提供这种同步行为呢?因为在某些特定情况下,它恰好是适当 UX 的正确工具。那些原生的模态对话框看起来真的很丑,并且同时非常受限制。
以下是一个快速而简单的示例,可以完全冻结浏览器,直到用户给出反馈。假设我们有一个具有 form
和 input[type="reset"]
元素的表单。因此,在我们真正让 form
重置之前,我们会问用户类似于:“您确定要重置吗(数据将丢失)?”
如果我对原生模态对话框的外观感到满意(但事实并非如此),我可以这样做:
document.querySelector('form').addEventListener(
'reset', e => confirm('Are you sure you want to reset (data will be lost)?') || e.preventDefault()
);
<form>
<input placeholder="type something, reset and cancel to keep input value" style="width:100%">
<input type="reset">
</form>
所以,“每个人”都应该同意(编辑:或至少有人可以这样做),这不是不好的做法,对吧?
但我们如何通过自定义样式的模态框/对话框/弹出框来实现相同的效果?
当然,我并不是要求 HTML
/CSS
的部分,而是需要用 JavaScript 冻结浏览器窗口的能力!
说实话,我其实预计会收到一些负评,但也许有这位“杀手级 JavaScript 忍者”,他们有一个特殊的技巧可以实现……
async / await
,你可以做到const sure = await showConfirm();
,它只需要你的确认对话框是一个promise。 - Keith