zoukankan      html  css  js  c++  java
  • storage 事件监听

    在公司的一次内部分享会上, 偶然知道了这个H5的新事件, 解决了我之前的一个bug.

    事情是这样的, 第A网页上显示的数量的总和, 点击去是B页面, 可以进行管理, 增加或者删除, 当用户做了增删操作之后, 返回到A页面的时候不会更新数量, 这个问题困扰了很久

    终于等到storage事件, 据说淘宝的购物车就是这么实现的

    所以, localStorage的例子运行需要如下条件

    • 同一个浏览器打开了两个同源网页
    • 其中一个网页修改了localStorage
    • 另一个网页注册了storage事件

    例子

    A网页监听了storage事件

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>a</title>
    </head>
    <body>
    <script type="text/javascript">
        window.addEventListener('storage', function(e) {
            console.log('storage', e.newValue);
        })
    </script>
    </body>
    </html>

    B网页修改了localStorage

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>B</title>
    </head>
    <body>
    <button id="btn">点击</button>
    </body>
    <script type="text/javascript">
        var btn = document.getElementById('btn');
        btn.onclick = function() {
            localStorage.clear();
            localStorage.setItem('foo', 'bar');
        }
    </script>
    </html>

    运行: 将上面两个网页, 放到同一个服务器上, 在同一个浏览器上打开两个页面, 点击B网页中的按钮, 就会看到A网页中console打印内容

    扩展

    如果非要在同一个网页中监听怎么办, 可以重写localStorage的方法, 抛出自定义的事件

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <title>A</title>
    </head>
    <body>
    <script>
        var orignalSetItem = localStorage.setItem;
        localStorage.setItem = function(key,newValue){
            var setItemEvent = new Event("setItemEvent");
            setItemEvent.newValue = newValue;
            window.dispatchEvent(setItemEvent);
            orignalSetItem.apply(this,arguments);
        }
        window.addEventListener("setItemEvent", function (e) {
            alert(e.newValue);
        });
        localStorage.setItem("nm","1234");
    </script>
    </body>
    </html>
  • 相关阅读:
    ES6/ES2015核心内容(上)
    集合转数组的toArray()和toArray(T[] a)方法
    重复输出一个给定的字符串
    10道典型的JavaScript面试题
    用 JavaScript 检测浏览器在线/离线状态(JavaScript API — navigator.onLine)
    List<实体>与List<String>数据互转
    CSS实现四种loading动画效果
    Windows上安装Mac OS
    Android应用层View绘制流程之measure,layout,draw三步曲
    推断输入信息是否为空
  • 原文地址:https://www.cnblogs.com/shenjp/p/8954725.html
Copyright © 2011-2022 走看看