Chrome 对于 JavaScript 对话框的新策略 —— 建议不要使用 alert(), confirm(), 和 prompt()

原文做者:Chromium team

编译:胡子大哈 javascript

翻译原文:huziketang.com/blog/posts/…

英文链接:Chromium policy on JavaScript dialogsjava

转载请注明出处,保留原文连接以及做者信息react

JavaScript 对话框的历史

JavaScript 诞生于 1995 年。第一个版本的 JavaScript 中窗口对象的几个方法是:alert()confirm(),和 prompt()android

这在当时的环境是很合适的,可是随着时间的推移,同期的 API 对于现代浏览器来说存在不少问题。由于这种 JavaScript 对话框模式是 app 模式,即此时 JavaScript 引擎是暂停状态,直到获得用户反馈。也正是由于这种 app 模式,在浏览器中很伤用户体验git

正因如此,Chromium 团队强烈建议不要使用 JavaScript 对话框。github

替代方案

有不少替代对话框的方案。web

对于替换 alert()/confirm()/prompt(),有不少可选方法。须要提醒用户(如日历网站),那么可使用 Notifications API。须要获取用户输入,可使用 HTML

element 。须要 XSS 概念验证,可使用开发工具的 console.log(document.origin)chrome

至于 onbeforeunload,须要注意的是它已经不可靠了。正如 Ilya Grigorik 所指出的:“在移动平台上,你不能依赖于 pagehidebeforeunloadunload 事件”。若是你想保存状态,应该使用 Page Visibility API浏览器

改变

网页中指定 onbeforeunload 字符串的功能在 Chrome 51 中就删除了(从 Safari 9.1 和 Firefox 4 版本之后它们也删除了)。app

alert()/confirm()/prompt() 对话框也正在修改,不一样于 app 模式,当浏览器 tab 发生切换时,它们会自动消失(Safari 9.1 已经这么作了)。这一功能在金丝雀版和开发者版已经彻底支持了,在 beta 和 稳定版中部分支持。可是能够确定的是未来必定会支持的更多。

对于 beforeload 对话框目前的计划是须要用户的许可才能显示(这将会改变 beforeload 的调用方法)。在这一点上 Chromium 和 Firefox 达成了一致,在 Firefox 44 中将会应用这一变化)。

正是由于发生了这些变化,若是你的网站使用了对话框(dialog),强烈建议你使用前面所提到的那些替代方案,以防对你产生影响。

网友评论

Chromium 此文一出,引发众开发者的热议。这里挑出一些典型的评论和观点。

  • Notification API 是另外一回事,你想取消就取消好了,可是谴责旧的、这么好用的 alert() 就是你的不对了。
  • 这会使得使用起来更麻烦,原来的 alert 方法很简单。
  • 作成 page 模式的就行了,就像 Firefox 7 年前作的那样,不多的改变,你们不须要重写代码。
  • 我查了文中给的关于 HTML element 的连接。里面的文章说,这是一种经验技术。我又查了浏览器状况,发现只有 Chrome 和 Opera 支持!
  • 越早变越好,如今已通过去了好几天了。
  • ...

显然,网友们反对声音大于支持的声音。不知道你是怎么看呢?欢迎你们一块儿讨论。


我最近正在写一本《React.js 小书》,对 React.js 感兴趣的童鞋,欢迎指点

相关文章
相关标签/搜索