Chromium 新的弹窗机制以及 HTML 的 元素

自 1995 年 JavaScript 诞生之初,就包含了 3 个方法 alert()confirm()prompt()。在随后的 Chrome 版本中,Chrome 团队一直在修改原生弹窗的表现。

但是这种阻断式的弹窗总被各种广告网站恶意使用,因为只要弹窗出现,JavaScript 引擎就会一直等待,知道用户操作。所以这种原生弹窗的最大用处不是用来提示用户信息,而是伤害用户(Tech support scammers use subdomain trick to defeat blocking)

因此 Chromium 团队强烈建议你不要使用这类弹窗。

而弹窗和 onbeforeunload 事件相结合之后那简直就是大杀器,而此类弹窗经常被用来提示浏览者xxxx。

Chromium 团队在 Chrome 51 中移除了对 onbeforeunload 弹窗的支持。在此之前 Safari 9.1 和 Firefox 4 早就已经移除了。当我们在 onbeforeunload 事件中调用 alert 时,会在 devtools 中产生警告:

Blocked alert('before unload') during beforeunload.

《Chromium 新的弹窗机制以及 HTML 的 <dialog> 元素》” /></span></p><p>除此之外,<code>alert()</code>、<code>confirm()</code>、<code>prompt()</code> 的行为也做了改变,不再作为顶级的原生弹窗而存在,当弹窗所在的浏览器标签被切走后,它们会自动消失。(Safari 9.1 说:“你怎么到现在才来学啊!”)</p><p>Chromium 在官方博客中说到:</p><blockquote><p>对于 <code>alert()/confirm()/prompt()</code> 我们有很多替代的选择。 譬如需要弹个通知消息时(日历应用)可以用Notifications API。 获取用户输入可以用 HTML 中的 <code><dialog></code> 元素。 对于 XSS proofs-of-concept 则可用 <code>console.log(document.origin)</code>。</p></blockquote><p><code><dialog></code> 作为 <a href=HTML 5.2 的元素,目前除了 Chrome 和 Opara 以外,其它浏览器均未支持。但是 Google 提供了一个 dialog-polyfill

一个最简单的例子:

<dialog>This is da dialog!</dialog>

这段 html 什么也不显示,开发者需要使用 javascript 的 API .show().close() 来控制 dialog 的显示和隐藏。

<dialog>
  <p>This is da dialog!</p>
  <button id="close">Close</button>
</dialog>

<button id="show">Open Dialog!</button>
var dialog = document.querySelector('dialog');

document.querySelector('#show').onclick = function() {
  dialog.show();
};

document.querySelector('#close').onclick = function() {
  dialog.close();
};

https://jsfiddle.net/m1dzstxo/

点击按钮会出现一个弹窗(非常丑)

《Chromium 新的弹窗机制以及 HTML 的 <dialog> 元素》” /></span></p><p>不过 dialog 作为一个 html 标签,是可以使用 css 的。我们给它加一段 css 样式:</p><pre><code>dialog {
  border: 1px solid rgba(0, 0, 0, 0.3);
  border-radius: 6px;
  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
}</code></pre><p><a href=https://jsfiddle.net/m1dzstxo/1/

再点击按钮,弹窗了一个稍微漂亮点的弹窗:

《Chromium 新的弹窗机制以及 HTML 的 <dialog> 元素》” /></span></p><p>我们还可以使用 <code>.showModal()</code> 弹窗一个模态对话框,当我们关闭弹窗时触发 <code>close</code> 事件。我们还可以使用 ESC 键关闭一个弹窗,此时会触发 <code>cancel</code> 事件。和其它所有事件一样,我们可以通过调用 <code>event.preventDefault()</code> 来阻止默认行为。</p><p>直接弹窗一个模态窗口是不够友好的,有时我们需要把背景虚化:</p><p><span><img layer-src=     原文作者:justjavac
    原文地址: https://segmentfault.com/a/1190000009954183
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

点赞