4

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

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

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

任何想法为什么我得到这个?

4

3 回答 3

4

我建议您查看jStoragelocalStorage ,它为、旧的globalStorageuserData行为提供通用接口。可能您可以直接使用 jStorage(参见此处)并节省编写相应代码的时间,或者您可以将相同的想法用于您自己的实现。您可以在此处找到有关旧 userData 行为的更多信息。

于 2012-05-29T13:33:40.077 回答
3

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

  • 首先确保所有相关框架都托管在同一个域上(包括打开 www.domain.com 上的顶级框架集以及没有“www.”的内部链接)
  • 如果您需要跨域脚本,请查看互联网以获取一些相关技巧来实现这一点(理论)。
  • 尝试将所有对 localStorage 的访问包装在顶部框架中的几个函数中可能是值得的(我可以想到一些原因,这些原因理论上可能会导致直接访问顶部框架中的对象出现问题......尽管这应该到目前为止据我所知工作)。
  • 尝试重新初始化对子帧的所有引用,例如,您可能忘记在 window.frames 引用前添加“var”,并且在导航后没有重新初始化它(它会解释错误消息,尽管这似乎不太可能发生错误)。
  • 确保不要在任何子框架内保留对自身的任何引用可能也是值得top.localStorage的(尽管同样,它不应该引起任何问题)。
  • 您可能需要考虑使用跨平台本地存储包装器。他们倾向于使用IE 中的专有功能,允许在 IE 中使用类似 localStorage 的功能(最大 1MB,但这应该足够了)。此类库的一个示例是store.js
于 2012-05-29T13:34:07.840 回答
2

请参阅导致错误“无法从已释放的脚本中执行代码”的原因

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

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

于 2012-05-25T08:48:10.860 回答