我是如何丢失JavaScript内置对象和所有全局变量的?

时间:2016-11-10 22:58:25

标签: javascript internet-explorer-11

我正在开发一个需要在大型浏览器中工作的Umbraco网站,包括IE 11,我遇到了一个奇怪的问题,我只能在IE 11上复制。

在某些时候,TinyMCE插件的脚本会尝试执行此代码(大约四个深度调用)以响应blur事件:

  function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); }

并且在尝试创建RegExp对象时抛出“对象不支持此操作”异常。 cls已定义且具有我期望的值。

在未处理的异常上暂停(使用Visual Studio调试器)时,我做了一些检查。

事实证明RegExpundefined。我发现这个非常很奇怪。

更多调查显示所有内置对象都未定义。数字,数组,对象,数学...所有这些。此外,虽然我可以枚举全局键,但所有值都未定义。

Weirder,我可以在有问题的范围内使用控制台或立即执行窗口,使用/pattern/语法创建正则表达式对象。

但是这种情况仅在事件处理程序的范围内才是真实的。一旦事件处理程序退出,就会恢复所有内置对象和全局变量值。

如何在不失去对基本JavaScript解析器和引擎的访问权的情况下,如何失去对内置JavaScript对象的访问权限?

而且,一旦丢失,是否有可能恢复它们?

1 个答案:

答案 0 :(得分:1)

我也遇到过这个问题,假设你也遇到了TinyMCE CodeMirror插件的问题,问题是由codemirror.js中的这一行触发的:

on(window, "blur", function () { return forEachCodeMirror(onBlur); })

其中window指的是包含CodeMirror编辑器的iframe。

此iframe位于TinyMCE对话框中。我发现错误只发生在iframe(或其中的元素)在关闭对话框的同时失去焦点,从DOM中删除iframe时。您可以在关闭对话框之前首先单击iframe外部(例如在页面覆盖上)来测试这一点。

IE11似乎在开始破坏iframe的blur对象后调用window事件。我会把它归类为IE11中的一个错误,它永远不会被修复。由于我们可能不关心从DOM中删除的iframe中的blur事件,因此我们可以通过修改问题行来解决问题,在这种情况下跳过它:< / p>

on(window, "blur", function () { if (window.RegExp) return forEachCodeMirror(onBlur); })