9

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

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

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

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

谁能想到任何其他阻止执行的 Javascript 方法,这些方法可能被(ab)用来达到预期的效果?

4

1 回答 1

4

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

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

创建像这样可靠的设置已经很困难了。但是,您可以尝试几乎所有javascript 功能(不涉及异步回调),因为默认情况下所有 JS 操作都是同步的。如果您想进一步实验,我建议您查看那些处理不同 DOM 环境(window.open、、跨帧访问)的方法,看看您是否可以让其中任何一种方法产生第二个document.write可靠地并行运行的环境。iframe.contentWindow

于 2014-10-16T00:52:31.547 回答