在IE7中发出模拟localStorage的问题

时间:2012-05-15 06:21:43

标签: javascript internet-explorer-7 local-storage

我有一个应用程序,顶部框架和顶部框架内有两个框架集。导航到其他页面时,顶部框架保持不变,只有框架集发生变化。我使用localStorage存储一些数据(也存储在服务器上,但如果它在客户端我们每次都不进行往返),IE7上没有这个功能,所以我们决定尝试模拟localStorage IE7。

我们的想法是在顶部框架上存储变量localStorage(仅当localStorage不可用时)。每当localStorage在顶部框架上不可用时,我们就会创建一个带有_data,getItem(),setItem(),removeItem()的虚拟localStorage对象。这个对象的生命周期与顶部框架的寿命一样长,这将为我们节省大量的往返服务器,因此在IE7中提供了很好的性能提升。

我遇到的问题是,每当我更改框架(不是顶部框架)并从顶部框架获取localStorage并尝试使用window.top.localStorage.getItem('... “);我收到错误消息无法从释放的脚本执行代码。

为什么我得到这个?

3 个答案:

答案 0 :(得分:4)

我建议您查看jStorage,它提供localStorage或旧globalStorageuserData行为的通用界面。可能你可以直接使用jStorage(参见here)并节省你编写相应代码的时间,或者你可以对自己的实现使用相同的想法。有关旧的userData行为的更多信息,例如here

答案 1 :(得分:3)

也许我会重复Brilliand已经分享的内容,但由于我完全不理解他的回答,我也会分享一些想法/建议:

  • 首先确保所有相关框架都托管在同一个域中(包括在www.domain.com上打开顶部框架集以及没有“www”的内部链接)。
  • 如果您需要跨域脚本,请查看互联网以获取相关技巧(the theory)。
  • 可能值得尝试在顶部框架中的几个函数中包含对localStorage的所有访问(我可以想到一些理论上可能导致直接访问顶部框架中的对象的问题的原因...虽然这应该据我所知工作)。
  • 尝试重新初始化对子帧的所有引用,例如,您可能忘记在window.frames引用前添加“var”而不在导航后重新启用它(它会解释错误消息,尽管它似乎不太可能出现错误)。
  • 也许值得确保在任何子框架内保留对top.localStorage本身的任何引用(但同样,它不应该导致任何问题)。< / LI>
  • 您可能需要考虑使用跨平台localstorage包装器。他们倾向于使用proprietary functions in IE在IE中允许类似localStorage的功能(最大1MB,但这应该足够了)。这种库的一个例子是store.js

答案 2 :(得分:2)

请参阅What causes the error "Can't execute code from a freed script"

当访问由子框架(已经关闭)创建的代码时,会出现该错误消息。这至少意味着,在关闭它们的窗口之后,你无法保持JavaScript函数;我不确定是否也适用于数据对象,但它可能。如果是这样,那么在顶部窗口中简单存储JavaScript对象将不起作用。

应该可以通过确保在存储数据之前从子窗口中完全分离数据来解决此问题。这可以通过使用存储功能(必须由父窗口单独创建)来完成,JSON对该数据进行编码,并存储编码的字符串。检索将不那么挑剔,因为检索到的对象不需要保持比检索它的子窗口更长的时间。