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

Ala*_*SFT 6 javascript internet-explorer-11

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

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

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

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

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

原来那RegExpundefined.我发现这非常奇怪.

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

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

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

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

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

Ste*_*ett 1

我也遇到过这个问题,假设您在使用 TinyMCE CodeMirror 插件时也遇到了问题,那么问题是由 codemirror.js 中的这一行触发的:

on(window, "blur", function () { return forEachCodeMirror(onBlur); })
Run Code Online (Sandbox Code Playgroud)

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

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

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

on(window, "blur", function () { if (window.RegExp) return forEachCodeMirror(onBlur); })
Run Code Online (Sandbox Code Playgroud)