通常,我们可以使用 window.addEventListener("storage", func) 或使用 onstorage 属性(如 window.onstorage = func)来监听 storage 事件:
window.addEventListener('storage', e => {console.log(e.key);console.log(e.oldValu);console.log(e.newValue);});window.onstorage = e => {console.log(e.key);console.log(e.oldValu);console.log(e.newValue);});
注意,该功能不会在发生更改的同一浏览器选项卡上触发,而是由同一域的其他打开的选项卡或窗口触发 。此功能用于同步同一域的所有浏览器选项卡/窗口上的数据 。因此,要对此进行测试,需要打开同一域的另一个选项卡 。
(4)存储限制localStorage 和 sessionStorage 只能存储 5 MB 的数据,因此需要确保存储的数据不会超过此限制 。
localStorage.setItem('a', Array(1024 * 1024 * 5).join('a'))localStorage.setItem('b', 'a')// Uncaught DOMException: Failed to execute 'setItem' on 'Storage': Setting the value of `a` exceeded the quota.
在上面的例子中,收到了一个错误,首先创建了一个5MB的大字符串,当再添加其他数据时就报错了 。
另外,localStorage 和 sessionStorage 只接受字符串 。可以通过 JSON.stringify 和 JSON.parse 来解决这个问题:
const user = {name : "zhangsan",age : 28,gender : "male",profession : "lawyer" };localStorage.setItem("user", JSON.stringify(user));localStorage.getItem("user");// '{"name":"zhangsan","age":28,"gender":"male","profession":"lawyer"}'JSON.parse(localStorage.getItem("user"))// {name: 'zhangsan', age: 28, gender: 'male', profession: 'lawyer'}
如果我们直接将一个对象存储在 localStorage 中,那将会在存储之前进行隐式类型转换,将对象转换为字符串,再进行存储:
const user = {name : "zhangsan",age : 28,gender : "male",profession : "lawyer" };localStorage.setItem("user", user);localStorage.getItem("user");// '[object Object]'
Web Storage 使用了同源策略,也就是说,存储的数据只能在同一来源上可用 。如果域和子域相同,则可以从不同的选项卡访问 localStorage 数据,而无法访问 sessionStorage 数据,即使它是完全相同的页面 。
另外:
- 无法在 web worker 或 service worker 中访问 Web Storage;
- 如果浏览器设置为隐私模式,将无法读取到 Web Storage;
- Web Storage 很容易被 XSS 攻击,敏感信息不应存储在本地存储中;
- 它是同步的,这意味着所有操作都是一次一个 。对于复杂应用,它会减慢应用的运行时间 。
<input type="checkbox" id="darkTheme" name="darkTheme" onclick='onChange(this);'><label for="darkTheme">黑暗模式</label><br>
html {background: white;}.dark {background: black;color: white;}
function toggle(on) {if (on) {document.documentElement.classList.add('dark');} else {document.documentElement.classList.remove('dark');}}function save(on) {localStorage.setItem('darkTheme', on.toString());}function load() {return localStorage.getItem('darkTheme') === 'true';}function onChange(checkbox) {const value = https://www.isolves.com/it/cxkf/bk/2022-11-09/checkbox.checked;toggle(value);save(value);}const initialValue = load();toggle(initialValue);document.querySelector('#darkTheme').checked = initialValue;
这里的代码很简单,页面上有一个单选框,选中按钮时将页面切换为黑暗模式,并将这个配置存储在 localStorage 中 。当下一次再初始页面时,获取 localStorage 中的主题设置 。3. Cookie(1)Cookie 概述Cookie 主要用于身份验证和用户数据持久性 。Cookie 与请求一起发送到服务器,并在响应时发送到客户端;因此,cookies 数据在每次请求时都会与服务器交换 。服务器可以使用 cookie 数据向用户发送个性化内容 。严格来说,cookie 并不是客户端存储方式,因为服务器和浏览器都可以修改数据 。它是唯一可以在一段时间后自动使数据过期的方式 。
每个 HTTP 请求和响应都会发送 cookie 数据 。存储过多的数据会使 HTTP 请求更加冗长,从而使应用比预期更慢:
- 浏览器限制 cookie 的大小最大为4kb,特定域允许的 cookie 数量为 20 个,并且只能包含字符串;
推荐阅读
- 六种常见妇科炎症 妇科炎症用什么药好
- 陶渊明的最经典10句诗,陶渊明的经典诗句精选-
- 约翰尼·德普|知名女星街头大便,裤子拉到大腿下,好友坐旁边与其聊天
- 沉头螺钉操作方法及常见问题 开槽沉头螺钉!
- 中速磨常见故障现象及处理 中速磨常见故障
- 过敏性鼻炎的症状有哪些常见表现 过敏性鼻炎的症状
- 电脑常见故障排查及维修方法 电脑故障检测
- 常见妇科病 常见妇科病的症状
- 鲍鱼养殖技术流程及常见病害的防治 鲍鱼养殖
- 乳腺增生的六种常见中成药 乳腺增生吃啥药