Javascript中阻塞了哪些方法?

Vil*_*lx- 9 javascript synchronous blocking

我试图confirm()在Javascript中覆盖标准方法(制作一个漂亮的UI和东西).我已经阅读了100篇"无法完成"的帖子,但我不想放弃,直到我给它一个公平的镜头.:)

所以,真正的问题当然是该confirm()方法必须阻止所有javascript执行,直到用户选择一个选项.那么,Javascript中有哪些阻塞行为的方法呢?我已经能够拿出5:

  • alert() - 不适合我,因为它显示了自己不需要的UI;
  • confirm()- 同样的问题alert();
  • 无限循环 - 即使是现代浏览器也会疯狂地吃掉CPU并显示"停止javascript"?几秒后提示;
  • XmlHttpRequest 在同步模式 - 排序,但它涉及服务器......
  • showModalDialog() - 很好,但我需要一个特定的设计,还有一些浏览器兼容性要求......

到目前为止,我最好的方法是创建一个<iframe>带有提示符(然后获取自己的javascript执行线程)并阻止,XmlHttpRequest直到用户选择了一个选项<iframe>.不幸的是,这涉及在服务器之间反复传递结果,我想让这个100%客户端.此外,它在打开对话框时占用服务器线程,并且可能存在一些适用于浏览器的特定ajax超时.

任何人都可以想到阻止执行的任何其他Javascript方法,这些方法可能(ab)用于实现所需的效果吗?

Ber*_*rgi 5

不,这是有充分理由不能完成的。页面中的任意自定义样式的用户交互始终是异步的(基于事件),因此不适用于任何类型的阻塞行为(停止无限循环的事件只会在无限循环完成后发生) 。

您提到的所有这些阻止方法都在与页面不同的环境中进行用户交互 -由浏览器控制的alert//弹出窗口,由浏览器加载的不同页面- 并且该环境需要能够在第一个被冻结时获得焦点。confirmpromptshowModalDialog

创建这样一个可靠的设置已经够困难的了。但是,您可以尝试几乎所有JavaScript 功能(不涉及异步回调),因为默认情况下所有 JS 操作都是同步的。如果您想进一步实验,我建议您查看那些处理不同 DOM 环境(window.opendocument.writeiframe.contentWindow跨框架访问)的方法,看看您是否可以使用这些方法来生成可靠地并行运行的第二个环境。