這是一個棘手的問題,讓我撓了腦袋幾天。用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