这可能是很多人学习JavaScript的第一件事。
alert("Hello, World");
有一天,在CodePen,我们被一大堆关于他们的Pens被破坏的客户支持单吵醒了,最终归结为Chrome的一个版本,他们把alert() 从跨源iframe的功能中剥离出来。还有其他所有原生的 "JavaScript对话框",如confirm(),prompt() 和我不知道是什么的(onbeforeunload ?,.htpasswd 保护资产?
跨源iframes基本上是CodePen工作的核心。你写代码,我们在一个与CodePen本身不共享同一域的iframe中为你执行,这是第一道安全防线。我们没有听到任何抬头或任何东西,但我肯定计划是在展示。
我在推特上写道:"我感到很沮丧。我知道这里有潜在的安全问题。无论是否由iframe触发,JavaScript对话框_看起来都是一样的_,所以当它们由iframe触发时,尤其是跨源iframe,父页面可能没有什么控制权,这显然是令人困惑的。好吧,除了像CodePen这样的网站之外,你知道。Chrome也提到了性能方面的问题,因为这些JavaScript对话框的性质是,当它们打开时,会阻塞主线程,这基本上会停止一切。
不过,iframes可能会带来各种安全和用户体验方面的问题。**这就是为什么沙盒是一个东西。**我可以这样做。
<iframe sandbox></iframe>
而且,那个傻瓜被锁住了。如果有些表单试图在那里提交一些东西:不,不会工作。如果它试图触发一个下载呢?不行。要求设备访问?没办法。它甚至根本无法加载任何JavaScript _。_也就是说,除非我让它这样做。
<iframe sandbox="allow-scripts allow-downloads ...etc"></iframe>
那么,为什么不为JavaScript对话框设置一个属性呢?讽刺的是,现在已经有一个了:"allow-modals"。我不完全确定为什么这还不够好,但据我所知,在跨源iframe中取消JavaScript对话框只是最终目标的一个垫脚石:把它们从网络平台上完全删除**。**
哒哒哒。完全?就是这个词。想象一下,有多少编程教程会被彻底破坏。
目前,即使是跨源删除也被推迟到2022年1月,但据我们所知,这将继续进行,然后后续步骤将发生,完全删除它们。这是由Chrome浏览器带头的,但状态报告显示,Firefox和Safari都在进行这一改变。另外,这是一个规格化的变化,所以我想我们可以在这里到处摇摆我们的手指,如果你像我一样,觉得这不是特别好的处理。
到目前为止,我们被告知,如果你真的_绝对需要_为跨源iframe保留这个功能,解决方案是使用postMessage 。这将用户在window.alert 中使用的字符串发送到父页面,并从那里触发警报。我在这里不是最喜欢的,因为。
postMessage不像JavaScript对话框那样是阻塞的。这改变了应用程序的流程。- **我必须为此向用户代码中注入代码。**这是新的技术债务,它可能会损害预期的用户输出的期望(例如,在他们的HTML中,一个额外的
<script>有奇怪的影响,比如改变:nth-child和朋友的选择)。 - 一般来说,我对把用户生成的_任何东西_传递给父类来执行感到担忧。我相信在理论上有一些安全的方法,但XSS攻击载体的巧妙程度总是令人惊讶。
即使是低调的建议,如window.alert = console.log ,也有本质上相同的问题。
请允许我把话筒交给其他人,征求他们的意见。
难道警报不能包含在iframe中,而不是显示在父窗口中吗?
Jaden Baptista,Twitter
是的,请。这不就解决了很大一部分的问题吗?同时使这些对话框的用户体验更加有用?把那些该死的对话框_放在_ <iframe>.
"不要破坏网络。"到 "不要破坏90%的网络。"再到现在的 "不要破坏我们同意的内容的网络。"
马修-菲利普斯,Twitter
我尊重摆脱[HTML规范]中那些可被视为历史错误并导致实施复杂性的不雅部分的愿望,但我无法摆脱这样一种感觉,即现有的用例几乎没有得到尊重或好奇心的对待。
丹-阿布拉莫夫,Twitter
对我来说,这很奇怪,这是HTML规范的一部分,而不是JavaScript规范。对吧!?
我一直以为有一种 "首要指令",就是不要破坏网络?我真的见过基于网络的游戏,把
alert作为 "暂停",利用阻断的性质作为一种功能。比如:<button onclick="alert('paused')">Pause</button>[.]有趣,但却是事实。本-莱什,Twitter
有人引用了一个指标,即所有页面浏览中只有0.006%包含使用这些功能的跨源iframe,然而。
对于像
confirm(),似乎是一个误导性的指标。例如,如果账户删除流程使用confirm(),并且因为它的变化而中断,这并不意味着账户删除流程并不重要。它只是意味着人们不会在每个会话中点击它。丹-阿布拉莫夫,Twitter
这就是我特别关注的地方:alert() 是一件事,但confirm() 字面意思是返回true 或false ,意味着它是程序中的一个逻辑控制结构。去掉它就会破坏网站,这是毫无疑问的。克里斯-费迪南迪给我看了这个使用它的不起眼的小网站。
说到克里斯。
这种居高临下的 "你真的读过吗,它是如此的清楚 "的反驳,是一种傲慢的态度。这就相当于开发者文档中的 "只是 "或 "简单"。
我读了。我不明白。这就是为什么我问了一个人,他的工作就是与开发者沟通Chrome对平台的改变。
这并不是Chrome的一个开发人员所为。在出现这一变化的整个消息线中,充满了人们乞求Chrome浏览器不要推进这一提议,因为它将破坏所有的东西。
克里斯-费迪南迪,"谷歌与网络"
杰里米在这里说。
[......]破坏性的变化在网络上并不经常_发生_。它们是--而且应该是--罕见的。如果这一点改变了,网络将在可预测性方面受到巨大的影响。
其次,网络开发者没有_责任_去跟踪那些有可能被废弃的旧功能。那是浏览器制造商的责任。我真诚地希望我们不要去咨询一个叫做
canistilluse.com的网站。杰里米-基思,"基础"
我在这里描绘了一幅相当暗淡的画面。公平地说,有一些推文带有_Yes!_氛围,但我觉得它们不像是批评性的评估,而像是随机的谷歌欢呼声。
信不信由你,我通常_是_谷歌的粉丝,认为他们在推动网络发展方面做得很好。我也认为,当我看到问题并要求他们做得更好时,挥舞手指是合适的。"更好 "在这里意味着更多的开发者和用户的联系,以说明情况,更多的关于潜在影响和过渡想法的对话,以及更多的_开放_,以弯曲未来的路线。
The postChoice Words about the Upcoming Deprecation of JavaScript Dialogsappeared first onCSS-Tricks.你可以通过成为MVP支持者来支持CSS-Tricks。