2

是否有可能让 JavaScript(特别是 JavaScript 变量及其内容)在完整的 HTTP 请求中存活下来?我想在页面更改时在客户端“缓存”/持久化信息,而不必使用隐藏的表单字段或任何与 HTML 相关的东西。

这可能吗?

编辑:让我为我的意思添加一个用例。

  1. 假设我有一个名为arrayOfPersons的 JavaScript 数组,我将它作为页面 /HomePage 的一部分加载,现在它包含 1,000 个客户端对象。
  2. 现在用户切换页面并将一个全新的页面 /MyAccount 加载到浏览器中
  3. 我的目标:在用户请求全新页面/ MyAccount 后,我​​在页面/HomePage 上加载的arrayOfPersons 仍然可用。

希望能澄清我的意思。谢谢!

4

7 回答 7

5

只是为了补充尼克的答案,不同的浏览器支持以一种或另一种形式持久存储的想法。在过去的一年里,已经为所有浏览器进行了一系列标准化工作。

这是一个包含 HTML 5 的 DOM 存储、Microsoft 的UserDataSession Cookie 和window.name(使用 JSON 序列化作为window.name can 仅存储字符串)的库。

这是另一个只关注window.name(实际上适用于 Opera 9+、IE6+、Firefox 1.5+、Safari [3 我认为)。

这是一个jQuery 插件,它使用.swf(flash)文件来提供最多的跨浏览器支持(尽管如果您配置它,它确实支持本机解决方案)。我不能保证它,但应该为这个 jQuery-lovin' 社区提及它。

于 2009-09-24T12:46:05.557 回答
3

对的,这是可能的。它有点像我用来在整个会话期间维护页面状态(在客户端)的技巧。

有一个基本页面(如主页面),在整个会话期间从不刷新,它只在其中获取 iframe。您的所有应用程序页面都将加载到该框架中。

将您的状态信息作为 JS 对象存储到该母版页中。您可以从 iframe 中的子页面访问母版页(父)javacript 对象。它将通过客户端的会话进行维护。

这是最简单的方法。它工作得非常整洁。

于 2009-09-24T09:11:45.637 回答
2

找到一个有用的

JSOC:JavaScript 对象缓存

JSOC 框架是一个可插入的、可扩展的、开源的 JavaScript 客户端缓存框架。

JSOC 为 Web 开发人员提供了一种在任何支持 JavaScript 的浏览器中执行常见缓存技术(添加、替换、删除、刷新等)的简单方法。

由于 JSOC 是一个独立的 JavaScript 模块,将 JSOC 合并到 Web 开发项目中只需包含一个脚本引用,并使用常见的缓存方法。JSOC JavaScript 模块中包含低级方法,因此开发人员可以专注于手头的 Web 开发任务。

于 2009-09-24T09:06:25.957 回答
2

较新的浏览器支持DOM 存储,它允许您存储可以在页面之间持久存在的任意数据。您还可以使用隐藏的 Flash 应用程序来记住事情。有像Dojo Storage这样的库可以为您处理检测,因此您只需保存数据,它将使用任何可用的数据。

它不会自动为下一页保存所有 Javascript 变量 - 您需要添加一个 onunload 处理程序来存储用户离开页面时想要的内容。

于 2009-09-24T09:16:13.550 回答
0

框架集会给你一个地方来保存你的 javascript,但是整个页面加载......我认为不会。

Cookie 也可能对“持久化”数据有用,但这不是您所要求的。

于 2009-09-24T09:04:12.357 回答
0

一种可能性是使用框架集并将对象保留在那里,另一种可能性是序列化它们并通过以下任一方式持久化数据

window.name
document.cookie
location.search

document.cookie是在同一域中的页面调用之间存储数据的规范方法,并提供控制访问和生命周期的机制。

如果您使用window.name,则数据会在浏览器实例的整个生命周期内持续存在。

使用window.location更加棘手,您必须显式修改链接以发送数据(这可以使用事件委托轻松完成)。

于 2009-09-24T12:51:23.563 回答
0

如果我理解正确,您只需将自己的缓存功能添加到所有表单的 onSubmit 和所有链接的 onClick 中,例如:

var cachedpages;
$("A").onclick(function(){
    url = $(this).attr('href'); // maybe hash?
    if (cachedpages[url]) {
         // replacing all html
    } else {
         $.get(url, function(data){
              cachedpages[url] = data;
              // replacing all html
         });
    }
    return false;
});
于 2009-09-24T09:08:54.923 回答