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 behavior 基本原理与启用方式
userData 是一种 CSS behavior,通过附加到任意元素(通常为隐藏的 为保持代码一致性,建议封装一个类,对外提供 userData 行为看似简单,但实际使用中易出问题: 以下为最小可行封装示意(省略错误处理和 IE6 兼容补丁):
),并用 CSS 绑定 behavior:#storageEl { behavior: url(#default#userData); }
load() 和 save() 方法显式读写;不自动同步,也不触发事件封装统一的 storage 接口(兼容 localStorage)
setItem(key, value)、getItem(key)、removeItem(key)、clear() 等方法,内部根据环境自动选择后端:
window.localStorage 是否可用(包括 try-catch 防止隐私模式报错)load() 验证是否就绪(IE6/7 可能因安全策略禁用,需兜底到内存对象)JSON.stringify()),读取时反序列化;注意 IE7 不支持原生 JSON,需引入 json2.js关键细节与常见陷阱
example.com/a.html 与 example.com/b.html 无法共享;建议统一用根路径(document.documentElement.setAttribute("UserDataPath", "/");)或确保调用页路径一致element.save("storageName") 时,名称必须与之前 load("storageName") 一致,否则读不到数据element.setAttribute("charset", "UTF-8"),并在 save 前确保 DOM 元素内容为 UTF-8 字符串轻量级 polyfill 示例(仅核心逻辑)
var storage = (function() {
if (typeof localStorage !== 'undefined') {
return localStorage;
}
var el = document.createElement('div');
el.style.display = 'none';
document.body.appendChild(el);
try {
el.addBehavior('#default#userData');
el.load('storage');
return {
setItem: function(k, v) {
el.setAttribute(k, JSON.stringify(v));
el.save('storage');
},
getItem: function(k) {
var v = el.getAttribute(k);
return v ? JSON.parse(v) : null;
},
removeItem: function(k) {
el.removeAttribute(k);
el.save('storage');
},
clear: function() {
el.innerHTML = '';
el.save('storage');
}
};
} catch(e) {
// 降级为内存存储(页面生命周期内有效)
var mem = {};
return {
setItem: function(k, v) { mem[k] = v; },
getItem: function(k) { return mem[k]; },
removeItem: function(k) { delete mem[k]; },
clear: function() { mem = {}; }
};
}
})();
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










