每当显示alert
时,我始终会看到浏览器“锁定”自己。这个小技巧也经常被欺骗网站滥用,以防止你关闭浏览器,或在你的计算机上做任何其他事情。
我看不出为什么像 Google 这样的科技巨头会允许(或添加)这种功能的原因?这似乎更像是一个缺陷,与一个特征相对立。
我知道有一个复选框,询问用户是否希望警报停止显示,但我已经看到了无数的解决办法。
那么,为什么还是一件事呢?任何人都可以解释为什么这甚至会成为一个有用的功能(因为,作为开发人员,我从来没有遇到过使用它的需要)?
感谢。
答案 0 :(得分:3)
归结为向后兼容性。 alert
在20世纪90年代被设计为一种阻挡模式。如果它们改变了依赖它的行为,它将破坏许多脚本。如果不破坏脚本,prompt
和confirm
将无法实现。
至少大多数现代浏览器都有“阻止此页面提醒”复选框。
答案 1 :(得分:2)
之所以如此,是因为它(并且是)规范的一部分。
The current HTML5 specs在“用户提示”部分中说明了这一点。
alert
:
可选择在等待用户确认时暂停 消息
confirm
:
暂停,直到用户正面或负面回应
prompt
:
等待用户回复时暂停。
浏览器(用户代理)暂停alert
暂停,为了与其他用户提示保持一致,可能忽略了可选部分。
此外,我们在此时,the specs say this about pause
:
由于历史原因,本规范中的一些算法 要求用户代理在运行任务时暂停,直到出现条件 目标得以实现。这意味着运行以下步骤:
如有必要,请更新任何文档的呈现或用户界面 或浏览上下文以反映当前状态。
- 醇>
等到达到条件目标。用户代理暂停时 任务,相应的事件循环不能运行任何进一步的任务 当前运行的任务中的脚本必须阻止。用户代理应该 但是,虽然暂停,但仍然会在暂停时保持对用户输入的响应 因为事件循环不会做任何事情而减少了容量。
因此,虽然规范确实说要保持用户代理响应,但似乎这样做并不容易。因为,之后它以粗体红色:
显示此警告警告: 暂停对用户体验非常不利,尤其是在用户体验方面 在多个事件之间共享单个事件循环的场景 文档。鼓励用户代理尝试替代方案 暂停,例如旋转事件循环甚至简单地继续 在任何情况下都没有任何暂停执行 可以这样做,同时保持与现有的兼容性 内容。如果不那么激烈,这个规范将会愉快地改变 发现替代品与网络兼容。
在此期间,实施者应该意识到各种各样的 用户代理可能尝试的替代方案可能会发生微妙变化 事件循环行为的各个方面,包括任务和微任务计时。 即使这样做,实现也应该继续进行试验 它们违反了暂停操作所暗示的确切语义。
这样做的关键是鼓励实施者寻找并尝试不那么激烈的替代方案。但是,同时保留与现有内容的兼容性(例如阻止脚本)。