问题描述
我有一个非常大的代码库,其中到处都是 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 次更改,有没有什么方法可以使实现变得简单,这样每个更改都不需要特定的处理?
还是我被搞砸了?
解决方法
不幸的是,这听起来不可能,因为:
- 你想让它同步,这意味着当模态打开时没有可以在主线程上运行,并且
- 您希望浏览器呈现模态并知道用户何时想要关闭它。
由于 HTML 呈现发生在主线程上,因此浏览器呈现模态的唯一方法是 confirm()
函数返回(或抛出)并且调用堆栈为空。事件处理程序也面临同样的问题。
我不确定是否有办法通过扩展来解决这个问题(我的猜测是没有),但无论哪种方式,HTML 模式都不是要走的路。