这是一个棘手的问题,让我挠了脑袋几天。用JavaScript清除窗口对象中的自定义变量
我正在研究一个项目,该项目涉及到一个十年的Web应用程序并将其作为单页应用程序重新处理。应用程序非常庞大 - 我们必须工作的时间非常紧密,因此必须制定一些捷径。
然而,总体来说,我们对我们来到的距离印象深刻,因为我们必须克服一些有趣的技术障碍。
一个涉及清除所有自定义窗口变量。由于我们正在动态地重新加载应用程序的不同页面,因此我们需要清除所有自定义变量,以免发生冲突。我们所做的首先是加载应用程序的基本引导程序,并将窗口对象中的所有属性保存在一个数组中。然后,在加载每个新页面之前,我们循环浏览窗口属性并清除所有不在我们保存的数组中的对象(将窗口状态返回到加载页面之前)。
现在,在我们测试过的所有浏览器中,除了IE7和IE8(这两者都需要支持)以外,这样的工作正常。问题似乎是全局变量似乎并不总是在窗口对象上注册。
有没有人对这个问题有所了解?任何想法如何解决这个IE7?
任何信息将不胜感激。
编辑: 在引导装入我们这样做:
for (i in window) {
this.globalVars[i] = 1;
}
然后当我们加载一个新的页面(通过AJAX),我们这样做:
for (i in window) {
if (!this.globalVars[i]){
window[i] = undefined;
}
}
最终的解决方案:
最后,由于时间有限,最简单的修复方法是简单地将所有变量定义为var x;到var x = null;
然而,我发现了另一种解决方案。这里有一个小型图书馆,我用它作为替代解决方案的起点:http://www.thomasfrank.se/global_namespace.html
这并不完美(可能需要进行一些调整以使其更稳定一些,例如在AJAX调用中添加try-catch块例如,以便跨域脚本不会崩溃)。它的工作方式是对所有外部脚本文件和内部脚本进行分析,提取大量单词,然后可以使用这些单词清除窗口对象的属性。
我们实际上经历了一些非常奇怪的事情 - 这个脚本没有正确地提取很多变量......事实证明,它使用document.scripts来获取页面上所有加载的脚本,以便能够循环通过他们并解析它们。问题是jQuery不会以这种方式在页面上加载外部页面。它所做的只是将代码从我知道的传递给exec。因此,没有脚本标记实际上被添加到页面中。
解决方法是解析原始AJAX响应并存储对所有脚本标记的引用(以及我想提取内联脚本),然后修改该库以便能够处理这些文件。这应该有效,但所有这些处理过程都因为速度原因而太可怕 - 发现我们可以简单地在所有变量定义上进行搜索&替换,并且大部分工作无需每个页面加载的大量工作显然我们应该采取哪条道路。
为“清除”自定义变量的任何示例代码? – 2012-08-10 05:53:57
窗口对象的哪些属性在这里似乎是问题?你确认他们在循环浏览窗口对象时显示了吗?我的第一个想法是,已知的问题循环使用'x in something',也许你遇到了这个问题。 – WTK 2012-08-10 13:20:36
这些问题不是主要与循环数组相关的问题,而不是与对象相关的问题?无论如何,问题在于IE7似乎并没有在窗口对象上添加所有全局变量作为属性,所以它不会像循环一样出现。但是,如果您尝试直接访问它,则可以访问它。 – NRaf 2012-08-11 03:09:57