今天使用客户端存储。

我最近尝试本地存储表单内容,使其能够抵御意外的标签关闭和崩溃。以下是我了解到的关于实现客户端存储的不同方法。

Cookie 可能失效

Cookie 不是一种有效的存储方式,因为它们的大小限制在大约 4000 个字符(4KB),并且像一个累赘,降低网站的响应速度localStorage 另一方面,是专门为此目的而设计的,但在 IE6、IE7 和 Firefox3 中不可用

store.js 来救援

因此,第一个任务是在这些旧版浏览器中查找可用的备用解决方案(或 *shim* 或 *polyfill*)。事实证明,store.js,由Marcus Westin@marcuswestin)开发,将 localStorage 和回退方案封装在一个简洁的 API 中,文件大小很小(与 json2.js 一起压缩后为 2KB)。以下是一个简短的使用示例

它是如何工作的?

在 Firefox2 和 Firefox 3 中,它使用 globalStorage API,在 IE6 和 IE7 中,它回退到userData 行为,它有两个需要注意的重要限制

  • 存储限制为 128KB(而 localStorage 为 5-10MB),这仍然是很多文本,
  • 存储受 *相同文件夹策略* 的约束,这意味着不同文件夹中的页面不能访问相同的存储项。

第二个限制可能非常烦人,但可以通过在 iframe 中加载代码来解决。此技巧可能会集成到 Marcus 自己的代码中。

尽管 localStorage 只能存储字符串,但 store.js 使用JSON API 使得存储 Javascript 对象和数组成为可能。

防崩溃表单

使用此脚本,我能够构建Persival,一个简单的 jQuery 插件,可以监视表单的变化并立即持久化值

一个更复杂的演示页面 展示了用户在想要报告影响 Firefox 的错误时会遇到的表单(你会发现它实际上并不像看起来那么难)。如果您开始填写表单,然后关闭选项卡并再次点击相同的链接,您应该会看到魔法发生。这是一个简单但受欢迎的用户体验改进,不是吗?

Chris Heilmann 也演示了如何使用客户端存储来缓存 Web 服务数据并维护用户界面的状态:localStorage 及其使用方法

轮到你了

Persival 仍然很年轻,但已经属于你了,请随意使用它,从中学习并改进它。

也许您想在下一篇文章中看到类似的主题?**告诉我们!**

关于 louisremi

开发者关系团队,长期 jQuery 贡献者和开放网络爱好者。@louis_remi

更多由 louisremi 撰写的文章…


20 条评论

  1. Mathias

    如果可用,您可以通过使用 oninput 事件使 Persival 更加“即时”和响应式。

    2011年4月5日 08:04

  2. louisremi

    @Mathias:好主意。您知道哪些浏览器不支持此事件吗?

    2011年4月5日 08:19

  3. Mathias

    @louisremi:请参见 http://blog.danielfriesen.name/2010/02/16/html5-browser-maze-oninput-support/

    2011年4月5日 08:31

  4. Dextro

    我自己一直在使用 jstorage 来完成这项任务,到目前为止,它运行得相当不错(http://www.jstorage.info/

    2011年4月5日 08:51

  5. Hemilton

    嗯,Iframe

    2011年4月5日 13:58

  6. Mohamed Jama

    您好,

    LocalStorage 非常酷。我们目前正在测试一个项目,该项目使用 LocalStorage 在 expedia.co.uk 上的第三列搜索 Expedia 地图中存储用户行程。

    目前它仅适用于现代浏览器,但希望我们很快就能完全实施它。

    2011年4月5日 16:02

  7. Joss Crowcroft

    很棒的工作,伙计 - Persival 非常棒。对我来说,它似乎没有保留复选框的状态(Mac 上的 Chrome),但其他一切都很棒!

    2011年4月5日 23:28

  8. louisremi

    @Joss:确实,我还没有为复选框和单选按钮实现“状态持久性”。我很乐意看到我们的读者之一尝试一下。

    2011年4月6日 02:13

  9. Jaz

    如果您想要一些非常强大的客户端存储选项,请查看http://persistencejs.org/。这是一个真正的数据库对象抽象层,可与各种客户端存储方法配合使用,并且如果需要,可以通过 nodejs 与服务器端数据库同步。

    2011年4月6日 07:06

  10. louisremi

    @Jaz:这篇文章的重点是跨浏览器客户端存储。Persistence.js 提供的是更类似于关系数据库的 API。

    虽然在未来的文章中涵盖此 polyfill 是可以想象的,但它似乎仅适用于支持 WebSQL API 的浏览器。随着浏览器供应商逐渐放弃此 API,我想我们现在应该满足于键值存储。

    2011年4月6日 07:25

  11. Jaz

    @louisremi:目前 persistence.js 支持内存存储、Google Gears 和 WebSQL,但目标是支持任何出现的标准,重点是需要强大的本地数据库。这将取决于您的需求。对于移动开发,iOS 和 Android 目前使用 WebKit,因此 WebSQL 是一个很好的解决方案。Persistence 可以根据需要使用 window.localStorage,因此它应该与任何其他方法一样有用。

    2011年4月6日 07:49

    1. louisremi

      @Jaz:persistence.js 确实是一个有价值的解决方案。我很乐意看到一个 IndexedDB 适配器。

      2011年4月7日 01:20

  12. iLama

    我唯一要说的就是您对这个“解决方案”的实现很糟糕。我不确定脚本是如何做到的,但它允许对 Opera 的本地存储进行“蛮力”访问(可以这么说)(它甚至不会触发 Opera 询问我是否同意)。在修复此错误之前,我将把“store.js”视为恶意代码。

    2011年4月6日 09:14

    1. louisremi

      @iLama:由于 localStorage 是一种非常有限的客户端存储(大小限制为 5MB,无法访问您的文件系统),因此它不需要像文件或地理位置 API 那样请求您的许可。
      这不是错误,如果您认为 store.js 的实现可以改进,请随时在 Github 上进行分叉。

      2011年4月7日 01:16

  13. lobo_tuerto

    看看 Hacker News 上关于这篇文章的评论,它一定有价值

    http://news.ycombinator.com/item?id=2414662

    2011年4月6日 09:28

  14. Jonatan Littke

    从 UX 的角度来看,在编辑表单上使用它是一个危险的斜坡,其中输入字段的值表示当前存储在数据库中的内容,而不是最后输入的内容。

    想象一下,您在没有保存的情况下编辑了一些内容,关闭页面并返回。如果您在某个字段中看到自己的文本,您可能会认为数据库已保存您的编辑,但实际上它并没有。

    2011年4月7日 05:50

    1. louisremi

      Persival 可能不适用于所有表单,但它应该在用户键入时保存表单的内容。恢复的内容应该是您最后输入的内容。

      2011年4月7日 06:00

  15. Ryan

    IE 中是否支持将 json 对象作为命名空间存储?IE 不允许在“setAttribute”函数中使用某些字符。

    2011年4月8日 10:25

    1. louisremi

      @Ryan:store.js 将每个对象都存储为 JSON。
      您是否有不被接受的字符串示例?

      2011年4月8日 10:30

      1. Ryan

        当然!

        将以下值作为“键”将导致 IE6 和 7 中出现错误

        {“Session”:”42.1″}

        2011年4月8日 10:35

本文的评论已关闭。