原文做者:Chromium team
编译:胡子大哈 javascript翻译原文:huziketang.com/blog/posts/…
英文链接:Chromium policy on JavaScript dialogsjava
转载请注明出处,保留原文连接以及做者信息react
JavaScript 诞生于 1995 年。第一个版本的 JavaScript 中窗口对象的几个方法是:alert(),confirm(),和 prompt()。android
这在当时的环境是很合适的,可是随着时间的推移,同期的 API 对于现代浏览器来说存在不少问题。由于这种 JavaScript 对话框模式是 app 模式,即此时 JavaScript 引擎是暂停状态,直到获得用户反馈。也正是由于这种 app 模式,在浏览器中很伤用户体验。git
正因如此,Chromium 团队强烈建议不要使用 JavaScript 对话框。github
有不少替代对话框的方案。web
对于替换 alert()/confirm()/prompt()
,有不少可选方法。须要提醒用户(如日历网站),那么可使用 Notifications API。须要获取用户输入,可使用 HTML
。须要 XSS 概念验证,可使用开发工具的 console.log(document.origin)
。chrome
至于 onbeforeunload
,须要注意的是它已经不可靠了。正如 Ilya Grigorik 所指出的:“在移动平台上,你不能依赖于 pagehide
,beforeunload
和 unload
事件”。若是你想保存状态,应该使用 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 此文一出,引发众开发者的热议。这里挑出一些典型的评论和观点。
显然,网友们反对声音大于支持的声音。不知道你是怎么看呢?欢迎你们一块儿讨论。
我最近正在写一本《React.js 小书》,对 React.js 感兴趣的童鞋,欢迎指点。