JavaScript 对话框的历史记录
JavaScript 于 1995 年引入,在 JavaScript 的第一个版本中,是名为 alert()
、confirm()
和 prompt()
的窗口对象上的方法。
虽然它们在当时已经可以用到 JavaScript 中,但是对于现代浏览器来说,其同步 API 存在问题。由于 JavaScript 引擎需要暂停,直到获得用户响应,因此 JavaScript 对话框是应用模态对话框。由于这些对话框是应用模态对话框,因此它们通常(但遗憾的是)被用来伤害 我们的 用户。
因此,Chromium 团队强烈建议不要使用 JavaScript 对话框。
替代选项
有多种对话框替换选项。
alert()/confirm()/prompt()
有多个选项。如需向用户通知事件(例如日历网站),应使用 Notifications API。要获取用户输入,应使用 HTML <dialog>
元素。对于 XSS 概念验证,可以使用开发者工具的 console.log(document.origin)
。
至于 onbeforeunload
,需要注意的是,它已经不可靠。正如 Ilya Grigorik 指出的那样,“您不能依赖 pagehide
、beforeunload
和 unload
事件在移动平台上触发。”如果您需要保存状态,则应使用 Page Visibility API。
变更
Chrome 51 中已移除页面指定 onbeforeunload
字符串的功能。(从 Safari 9.1 和 Firefox 4 开始,Safari 也已将其移除。)
alert()/confirm()/prompt()
对话框已从应用模态模式更改为在切换标签页后关闭。此项变更已于 2017 年 5 月初在所有渠道中实施。
beforeunload
对话框需要用户在网页上执行手势,才能显示从 Chrome 60 开始。(这不会改变 beforeunload
事件的调度)。这使 Chromium 与 Firefox 保持一致,从而在 Firefox 44 中实现了此项更改。
在全屏模式下显示 alert()/confirm()/prompt()
对话框会导致从 Chrome 61 开始在全屏模式下丢失。
prompt()
个对话框未激活其标签页。如果从后台标签页调用 prompt()
,则调用会立即返回,并且不会显示任何对话框。此更改已于 2017 年 5 月初在所有渠道中实施。
alert()
个对话框未激活其标签页。如果从后台标签页调用 alert()
,调用会立即返回。该标签页标有指示器,当用户切换到该标签页时,就会看到该对话框。从 Chrome 64 开始,便会看到这种行为变更。
confirm()
个对话框未激活其标签页。如果从后台标签页调用 confirm()
,则调用会立即返回,并且不会显示任何对话框。从 Chrome 69 开始,便会出现此行为变更。
由于这些变更,如果您的网站使用对话框,强烈建议您改用前面提到的替代方案,以免对您造成影响。