html5 localstorage在现代浏览器中广泛支持,ie6/7需降级为userdata behavior:通过css绑定隐藏div、load/save显式操作、json序列化、处理路径隔离与utf-8编码,最终封装统一接口并fallback至内存存储。

HTML5 的 localStorage 在 IE8+、Firefox 3.5+、Chrome 4+ 等现代浏览器中已广泛支持,但对 IE6/IE7 这类旧版浏览器需降级处理。最成熟、兼容性最好的方案是利用 IE 特有的 userData behavior —— 它是微软在 IE5.5 引入的专有持久化存储机制,可稳定支持到 IE7,且无需 ActiveX 启用(区别于 ActiveXObject("ADODB.Recordset") 等方案)。
userData 是一种 CSS behavior,通过附加到任意元素(通常为隐藏的
)上,使该元素具备本地持久化能力。数据以 XML 格式保存在用户配置目录中,单个域下默认上限 128KB,可通过注册表调整。
- 需在页面中定义一个带 ID 的元素(如
),并用 CSS 绑定 behavior:
#storageEl { behavior: url(#default#userData); }
- 必须调用
load() 和 save() 方法显式读写;不自动同步,也不触发事件
- 仅 IE 支持,其他浏览器会忽略 behavior,需配合特性检测做 fallback
为保持代码一致性,建议封装一个类,对外提供 setItem(key, value)、getItem(key)、removeItem(key)、clear() 等方法,内部根据环境自动选择后端:
- 优先检测
window.localStorage 是否可用(包括 try-catch 防止隐私模式报错)
- 不可用时尝试创建 userData 元素并调用
load() 验证是否就绪(IE6/7 可能因安全策略禁用,需兜底到内存对象)
- userData 中所有键值需序列化为字符串(推荐
JSON.stringify()),读取时反序列化;注意 IE7 不支持原生 JSON,需引入 json2.js
userData 行为看似简单,但实际使用中易出问题:
- 路径作用域限制:userData 按完整 URL 路径隔离(含查询参数),
example.com/a.html 与 example.com/b.html 无法共享;建议统一用根路径(document.documentElement.setAttribute("UserDataPath", "/");)或确保调用页路径一致
- save() 必须指定范围:调用
element.save("storageName") 时,名称必须与之前 load("storageName") 一致,否则读不到数据
- UTF-8 编码问题:userData 默认按系统编码(如 GBK)保存,中文可能乱码;应在设置前调用
element.setAttribute("charset", "UTF-8"),并在 save 前确保 DOM 元素内容为 UTF-8 字符串
- 无过期机制:userData 不支持 TTL,需自行在值中存时间戳,读取时判断并手动清理
以下为最小可行封装示意(省略错误处理和 IE6 兼容补丁):
var storage = (function() var el = document.createElement(‘div’); el.style.display = ‘none’; document.body.appendChild(el); try ,
getItem: function(k) , removeItem: function(k) { el.removeAttribute(k); el.save('storage'); }, clear: function() { el.innerHTML = ''; el.save('storage'); } };
} catch(e) {
// 降级为内存存储(页面生命周期内有效) var mem = {}; return , getItem: function(k) { return mem[k]; }, removeItem: function(k) { delete mem[k]; }, clear: function() { mem = {}; } };
} })();
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/251834.html