我正在开发一个需要在大型浏览器中工作的Umbraco网站,包括IE 11,我遇到了一个奇怪的问题,我只能在IE 11上复制。
在某些时候,TinyMCE插件的脚本会尝试执行此代码(大约四个深度调用)以响应blur
事件:
function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); }
并且在尝试创建RegExp对象时抛出“对象不支持此操作”异常。 cls
已定义且具有我期望的值。
在未处理的异常上暂停(使用Visual Studio调试器)时,我做了一些检查。
事实证明RegExp
是undefined
。我发现这个非常很奇怪。
更多调查显示所有内置对象都未定义。数字,数组,对象,数学...所有这些。此外,虽然我可以枚举全局键,但所有值都未定义。
Weirder,我可以在有问题的范围内使用控制台或立即执行窗口,使用/pattern/
语法创建正则表达式对象。
但是这种情况仅在事件处理程序的范围内才是真实的。一旦事件处理程序退出,就会恢复所有内置对象和全局变量值。
如何在不失去对基本JavaScript解析器和引擎的访问权的情况下,如何失去对内置JavaScript对象的访问权限?
而且,一旦丢失,是否有可能恢复它们?
答案 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); })