首页 > 其他分享 >关于localStorage你可能忽略掉的一些方法和属性

关于localStorage你可能忽略掉的一些方法和属性

时间:2024-07-22 10:18:14浏览次数:14  
标签:标签 storage 忽略 callback localStorage key message 属性

localStorage 是我们常用的浏览器 API,用于在客户端进行持久化存储时非常方便。但你是否仅熟悉 setItem()getItem() 两个基础方法?本文将介绍 localStorage 的一些不常见但非常实用的方法和属性。

方法和属性

  • setItem(key, value) – 存储键值对
  • getItem(key) – 通过key获取存储的值
  • removeItem(key) – 删除键值对
  • clear() – 清空所有键值对
  • key(index) – 获取指定索引的 key
  • length – 返回键值对的个数

storage 事件

localStorage 绑定在同一源(域名 + 协议 + 端口)上,只有同源的标签页才能访问相同的 localStorage。如果想要监听其他标签页对 localStorage 的更新,可以使用 storage 事件。

// 在标签页1(www.baidu.com)中注册监听事件
// 也可以使用 window.addEventListener('storage', event => {}) 进行注册
window.onstorage = event => {
	console.log(event)
};

// 在第二个标签页(www.baidu.com)中更新storage
localStorage.setItem('test', Date.now());
  • key – 更新的键名。若调用 clear() 方法,key 将为 null
  • oldValue – 更新前的值
  • newValue – 更新后的值
  • url – 触发更新事件的页面 URL
  • storageArea – 触发更新事件的存储区域对象(localStoragesessionStorage

基于这个方法,我们实际上能做很多有意思的事情,比如,封装一个基于localStorage的广播API,用于同源下不同标签页之间的通信。

点击查看代码
// 定义广播 API 的类
class BroadcastAPI {
  constructor(channelName) {
    this.channel = channelName; // 广播通道的名称
    this.listeners = []; // 存储消息监听器的数组

    // 监听 storage 事件,以便接收其他标签页的广播消息
    window.addEventListener('storage', this.handleStorageEvent.bind(this));
  }

  // 发送消息到广播通道
  send(message) {
    localStorage.setItem(this.channel, JSON.stringify(message));
  }

  // 监听广播消息
  listen(callback) {
    this.listeners.push(callback);
  }

  // 处理 storage 事件,当其他标签页发送消息时被调用
  handleStorageEvent(event) {
    if (event.key === this.channel) {
      const message = JSON.parse(event.newValue);
      this.listeners.forEach(callback => {
        callback(message);
      });
    }
  }

  // 停止监听广播消息
  stopListening(callback) {
    this.listeners = this.listeners.filter(listener => listener !== callback);
  }
}

// 示例用法
const broadcast = new BroadcastAPI('myBroadcastChannel');

// 发送消息
broadcast.send({ type: 'greeting', content: 'Hello from another tab!' });

// 监听消息
broadcast.listen(message => {
  console.log('Received message:', message);
});

// 停止监听消息(可选)
// broadcast.stopListening(callback);

其他注意事项

  • 上述讨论也适用于 sessionStorage,但它对标签页有更严格的限制:当标签页关闭时,其内容将被清除。
  • key 和 value 都必须是字符串
  • 不同浏览器对数据存储的大小限制可能有所不同,一般来说,最多可存储约 5MB 的数据。
  • 若要获取所有存储的键,可以使用 Object.keys(localStorage)
  • 只有这几个方法会触发storage事件:setItemremoveItemclear

标签:标签,storage,忽略,callback,localStorage,key,message,属性
From: https://www.cnblogs.com/azoux/p/18315551

相关文章

  • LocalStorage封装
    前言localStorage 使用是一个老生常谈的话题,本文不讲解基础 api,主要教你如何封装一个优雅的localStorage 工具,以及一些 localStorage中一些你不知道的知识点。优雅的 Storage 工具类如何封装(支持前缀key、加密存储、过期时间,ts封装等)localStorage 真实存储大小......
  • 对类的属性动态排序
    publicstaticvoidsortByField(List<User>list,StringfieldName){list.sort((u1,u2)->{try{Objectvalue1=User.class.getDeclaredMethod("get"+capitalize(fieldName)).invoke(u1);......
  • Python第九章(面向对象基础--属性,继承,dir查看,内存地址,权限等等和银行账户题目,圆的面积
    面向对象创造对象示例代码:类的名字用小驼峰命名法#编写Person类classPerson():passclassCat:#,小括号可以省略pass#对象名=类名per=Person()c=Cat()#小括号不能省略print(type(per))print(type(c))代码结果:<class'__main__.Person'><class'__mai......
  • setattr 设置多级属性时似乎没有效果
    我正在为Ren'Py游戏编写一个mod,其中包含编辑游戏变量值的可能性(“作弊”)。游戏中的变量包括从简单布尔值到相当复杂的变量(例如simple_variable、obj.attr、obj.attr_a("some_id").attr_b)。这是我用来为变量/属性设置新值的函数(var_name是变量的字符串名称,new_val是我尝试设......
  • 如何忽略或绕过导致 NoneType 不可迭代对象的实例
    我正在尝试解析Edgar数据库中10K的部分,当我运行以下代码时,#pipinstalledgartoolsimportpandasaspdfromedgarimport*#TelltheSECwhoyouareset_identity("[email protected]")filings2=get_filings(form='10-K',amendments=False,......
  • AttributeError:“协程”对象没有属性“get_me”
    我尝试在Jupyter笔记本中运行以下代码,但出现错误:AttributeError:'coroutine'对象没有属性'get_me'但它在VisualStudioCode上运行良好。知道为什么吗?这是代码:fromtelethonimportTelegramClient,syncapi_id=******api_hash='*********************......
  • 忽略 CSV 文件开头的文本
    我正在尝试从网络下载CSV文件。但是,前20行是列定义,数据从第24行开始(中间的行是空白)。我的代码是:data=pd.read_csv(fileURL,skiprows=[23],on_bad_lines='skip')返回的是作为两列数据框的列定义,20k行数据被忽略如果没有-on_bad_lines-我收到错......
  • poi @Excel( name="" ) name属性自定义
    /***通过反射动态设置导出的Excel列名**@paramannotatedColumnName:实体类中被@Excel注解的字段名*@paramannotationFieldName:实体类中被@Excel中注解的属性名*@paramnewAnnotationFieldValue:属性的新值*/privatevoidsetEx......
  • 无人机之飞手很容易忽略的六件事
    一、每次更换起飞地要校准指南针每次当你去到一个新的起降点,记得举起你的无人机“跳一段舞”,进行一次指南针校准。不过也要切记,在校准时要远离诸如停车场、建筑工地和信号塔这些容易产生干扰的地方。二、日常要做好维护很多飞手容易忽略无人机的日常维护,所以导致无人机经常......
  • C#中属性
    1、引入       字段(field)可以在声明字段的同时赋给它一个初始值。假如将字段声明为public,则在类的外部都可以对该字段进行访问和更改,违背了类的封装特性。如果声明为private,则这种形式的封装通常又过于彻底。例如,你可能希望字段从外部只读,但从内部可以更改,但需要验证......