2012-05-15 98 views
4

模擬localStorage的我有一個頂部幀,該頂部框架內的兩個框架集的應用程序。在導航到其他頁面時,頂部框架保持不變,只有框架集改變。我使用的localStorage存儲一些數據(這也是存儲在服務器上,但如果是在客戶端,我們不要讓每次往返),此功能將不可用的IE7,所以我們決定嘗試模擬在的localStorage IE7。問題在IE7

的想法是爲存儲頂部框架(僅當localStorage的不可用)上的變量的localStorage。每當localStorage在頂部框架上不可用時,我們將使用_data,getItem(),setItem(),removeItem()創建一個啞元localStorage對象。這個對象的生命將持續到頂層框架的生命週期,這將爲我們節省大量往返服務器的時間,並因此在IE7中提供巨大的性能提升。

我遇到的問題是,每當我改變框架(不是頂部框架),我從頂部框架獲取localStorage並嘗試使用window.top.localStorage.getItem(' ...');我得到的錯誤信息無法從釋放的腳本執行代碼。

任何想法,爲什麼我得到這個?

+0

你使用回調? – eggyal

+0

是的,getItem(),setItem()是頂級框架中的localStorage對象的回調函數。 – woolagaroo

+0

您能詳細解釋這些回調函數的工作原理嗎? Web存儲不使用回調...... – eggyal

回答

3

也許我會隨聲Brilliand已經共享,但我不明白他的回答完全是我將分享一些想法/建議,以及:

  • 首先確保所有相關的幀託管在同一域(包括像上www.domain.com打開頂部框架和具有內部鏈接,沒有「WWW」。)
  • 情況下你需要跨域腳本檢查了互聯網的一些相關的技巧來實現那(the theory)。
  • 這可能是值得嘗試包裹在頂部框架的一些功能中的所有訪問localStorage的(我能想到的可能理論上導致與頂部框架直接訪問對象的問題有幾個原因......雖然這應該盡我所知工作)。
  • 嘗試重新初始化爲子幀的所有引用,你可能例如已經忘記了在window.frames參考前面添加一個「變種」,而不是導航後reinitalizing(它可以解釋的錯誤消息,儘管它似乎是一個不太可能的錯誤)。
  • 它也可能是值得確保不是任何引用top.localStorage本身內的任何子幀(雖然,再次,它不應該引起任何問題)。
  • 您可能需要考慮使用跨平臺localstorage包裝。他們傾向於與proprietary functions in IE一起工作,允許在IE中使用localStorage類似的功能(最大爲1MB,但應該足夠)。這樣一個庫的一個例子是store.js
2

參見What causes the error "Can't execute code from a freed script"

當由子幀(其已經被關閉)創建的代碼被訪問發生該錯誤消息。這意味着,至少,你不能在他們來自的窗口關閉之後保留JavaScript函數;我不確定它也適用於數據對象,但它可能。如果是這樣,那麼在頂部窗口中簡單存儲JavaScript對象將不起作用。

應該可以確保您完全存放之前,分離的子窗口中的數據,以解決此問題。這可以通過具有存儲功能(必須由父窗口創建)來完成,JSON編碼該數據並存儲編碼的字符串。檢索將不那麼挑剔,因爲檢索到的對象不需要比檢索它的子窗口保持更長的時間。

+0

我的觀點的關鍵是不要在頂部框架中存儲由子框架創建的任何東西;應該通過頂部框架完全重新創建由子框架提供的任何東西(即通過JSON編碼),以便可以安全地存儲它。 – Brilliand

4

我建議你看看jStorage,它們爲localStorage或舊的globalStorageuserData行爲提供通用接口。也許你可以使用jStorage直接(見here),並節省您的時間編寫相應的代碼,也可以使用同樣的想法爲自己的實現。有關舊用戶數據行爲的更多信息,例如here