視窗物件屬性會在孤立時清除

當視窗變成孤立狀態時,會清除全域物件 (window) 的屬性。系統會清除屬性,以允許在找不到全域物件的其他參考時進行孤立視窗的記憶體回收。此外,計時器會停止觸發,而事件傳播 (位於孤立的視窗內部) 會立即停止。 下列定義將有助於了解這個主題:

暫時性 iFrame:已剖析或暫時建立、新增,然後從文件物件模型 (DOM) 樹狀目錄移除且未重複使用的 iFrame 稱為「暫時性」iFrame

孤立的視窗:從 DOM 樹狀目錄移除暫時性 iFrame 時,在關閉它的視窗之前,系統會將該視窗視為「孤立的」(執行中,但是無法直接存取)。

IE9 標準模式中 iFrame 行為的變更

從 DOM 樹狀目錄移除 iFrame 元素時,會發生下列數種情況:

  • 系統會「清除」它們孤立的 window 物件,以允許孤立的視窗進行記憶體回收。在清除的 window 物件 (也就是全域物件) 上將不會顯示任何屬性。清除只涉及在 window 物件上移除屬性—它不會實際刪除這些屬性先前參考的物件。只在有其他對於該物件的外部參考時,才會提供存取在孤立視窗上出現的任何內建或使用者定義物件的能力。
  • 系統會取消現有的計時器 (例如 setTimeout),而且未來不會允許任何計時器執行。
  • 在變成孤立狀態的視窗內進行中的事件傳播會停止 (例如,就像在相關事件上叫用 stopImmediatePropagation API)
這些都是來自 Windows Internet Explorer 8 行為的變更,當暫時性 iFrame 的視窗變成孤立狀態時不會採取上述任何步驟。這些行為變更僅適用於 IE9 模式。舊版模式的行為就像它們在 Internet Explorer 8 中所做的一樣。

在舊版 Windows Internet Explorer (包含舊版 Windows Internet Explorer 9 文件模式) 中,從 DOM 樹狀目錄移除 iFrame 時,只會在頁面瀏覽期間回收孤立視窗的記憶體。進行頁面瀏覽之前,孤立視窗的記憶體將持續存在,而不會進行記憶體回收。在極少數的情況下,當網站使用多個暫時性 iFrame 來下載和/或執行內容而中間未進行頁面瀏覽時,每個孤立視窗的記憶體數量都會組合在一起,直到它對使用者在頁面上的使用經驗產生負面影響為止。 在孤立的視窗內既存的物件參考會保持可用狀態;但是,透過全域物件重新要求這些屬性將會失敗。失敗將歸類為指令碼錯誤,指出 "myRequestedProperty" 不存在或尚未定義。

我們建議您:

  • 從孤立的視窗要求的物件具備既存的參考 (來自孤立的視窗外部) 以便存取,而在孤立的視窗內容中執行的函式可以避免對於全域物件 (例如,陣列、物件) 之屬性的參考
  • 預期要觸發計時器的程式碼應該能夠彈性適應其視窗變成孤立狀態的可能性,以產生取消現有計時器的結果
  • 若事件處理常式具有移除其包含 iFrame 的副作用,則該事件處理常式應該能夠彈性適應它們的視窗變成孤立狀態的可能性,以便為目前傳播的事件產生 stopImmediatePropagation

相關主題

關於 stopImmediatePropagation API 的詳細資料

 

 

顯示:
© 2014 Microsoft