监听localStorage变化(同页面监听)

本文介绍了一种在同源页面中监听localStorage变化的方法,通过重写localStorage的setItem和removeItem方法,并抛出自定义事件来实现跨页面的数据变更通知。具体示例包括添加和删除本地存储项时触发的事件监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“当同源页面的某个页面修改了localStorage,其余的同源页面只要注册了storage事件,就会触发” 

同页面监听,重写localStorage的方法,抛出自定义事件:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>监听localStorage变化(同页面)</title>
</head>
<body>
<button class="add">add</button>
<button class="del">del</button>
<script src="http://code.jquery.com/jquery-3.3.1.js" integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
        crossorigin="anonymous"></script>
<script>
    var orignalSetItem = localStorage.setItem;
    localStorage.setItem = function(key,newValue){
        var setItemEvent = new Event("setItemEvent");
        setItemEvent.key = key;
        window.dispatchEvent(setItemEvent);
        orignalSetItem.apply(this,arguments);
    };
    window.addEventListener("setItemEvent", function (e) {
        if(e.key=='demo'){
            alert('key值为demo,添加成功');
        }
    });
    $('.add').click(function () {
        localStorage.setItem("demo","123");
    })
 
 
 
    var orignalremoveItem = localStorage.removeItem;
    localStorage.removeItem = function(key,newValue){
        var removeItemEvent = new Event("removeItemEvent");
        removeItemEvent.key = key;
        window.dispatchEvent(removeItemEvent);
        orignalremoveItem.apply(this,arguments);
    };
    window.addEventListener("removeItemEvent", function (e) {
        if(localStorage.getItem("demo")){
            if(e.key=='demo'){
                alert("key值为demo,删除成功");
            }
        }else{
            alert("本地数据无key值为demo")
        }
    });
    $(".del").click(function () {
        localStorage.removeItem('demo')
    })
</script>
</body>
</html>

 

### 实现跨多页面监听 `localStorage` 变化 为了实现在多个页面监听 `localStorage` 的变化,可以利用浏览器提供的 `storage` 事件。当 `localStorage` 发生更改时,所有其他源的浏览上下文(即不标签页或窗口中的文档)都会收到此事件通知。 #### 使用内置 `storage` 事件监听器 对于大多数情况而言,在不的浏览器标签页之间共享数据并响应其变更的最佳实践就是依靠原生支持的 `storage` 事件: ```javascript window.addEventListener('storage', function(event) { if (event.key === 'sharedData') { console.log(`'${event.key}' has been updated to '${event.newValue}'.`); } }); ``` 这段代码会在任何地方修改名为 `sharedData` 的键对时触发回调函数,并打印新的存储到控制台[^1]。 需要注意的是,在页面内调用 `setItem()` 不会触发自身的 `storage` 事件;只有来自其它源环境下的更新才会引起该事件的发生。 #### 处理单个页面内的本地操作 如果应用程序逻辑要求在页面内部也能检测到 `localStorage` 更改,则可采用自定义事件机制作为补充方案: ```javascript function updateLocalStorage(key, value){ localStorage.setItem(key,value); // 创建并分发一个新事件给当前文档对象 const customEvt = new Event('localStoreChanged'); document.dispatchEvent(customEvt); } // 添加针对自定义事件的侦听器 document.addEventListener('localStoreChanged',(e)=>{ let currentValue = localStorage.getItem('someKey'); console.log(`Local Storage item someKey is now ${currentValue}`); }) ``` 通过这种方式,即使是在一个页面里执行了 `localStorage` 更新动作,也能够及时接收到相应的通知[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值