有什么方法可以覆盖 JavaScript 的默认确认函数以在不编写回调的情况下同步阻止后面的 JavaScript?

问题描述

我有一个非常大的代码库,其中到处都是 JavaScript 确认函数。为了让我的客户更轻松,我编写了一个 Chrome 扩展程序,它使用 iFrames 将我的工具嵌入到另一个网站中。 (客户必须安装此 Chrome 扩展程序,我们与其他软件密切合作;这里没有任何秘密或恶意。)

感谢 the latest Chromium change,confirms no longer work inside of iFrames,这让很多客户感到困惑。我被迫用模态替换代码库中的所有内容

由于之前确认阻止了下一行 JavaScript 的执行,直到用户选择一个选项,因此代码通常如下所示:

    jQuery('form').submit(function() {
        var sure = confirm("Are you sure you want to submit the form?");
        return sure;
    });

有没有一种方法可以在一个地方(即模拟功能插件)重新编写它,而不必触及代码中的 100 个地方?或者,如果我确实必须进行 100 次更改,有没有什么方法可以使实现变得简单,这样每个更改都不需要特定的处理?

还是我被搞砸了?

解决方法

不幸的是,这听起来不可能,因为:

  1. 你想让它同步,这意味着当模态打开时没有可以在主线程上运行,并且
  2. 您希望浏览器呈现模态并知道用户何时想要关闭它。

由于 HTML 呈现发生在主线程上,因此浏览器呈现模态的唯一方法是 confirm() 函数返回(或抛出)并且调用堆栈为空。事件处理程序也面临同样的问题。

我不确定是否有办法通过扩展来解决这个问题(我的猜测是没有),但无论哪种方式,HTML 模式都不是要走的路。