Chromium 关于 JavaScript 对话框的政策

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 指出的那样,“您不能依赖 pagehidebeforeunloadunload 事件在移动平台上触发。”如果您需要保存状态,则应使用 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 开始,便会出现此行为变更。

由于这些变更,如果您的网站使用对话框,强烈建议您改用前面提到的替代方案,以免对您造成影响。