localStorage单页面及不同页面监听变动【转】

转载地址:https://www.cnblogs.com/7qin/p/10196539.html

分析

H5本地存储有两个API,一个是Web Storage,还有一个是Web SQL。不管是哪一个,都是基于JavaScript语言来使用,而Web Storage提供了两种存储类型 API: sessionStorage 和 localStorage,二者的差异主要是数据的保存时长及数据的共享方式。

那么,如何监测本地存储webstorage的数据是否改变呢?

在H5中,window对象里面有一个storage事件,我们可以进行监听或者指定其事件处理函数的方法,在其他页面修改了sessionstorage或者localstorage中的值时,就会触发注册了storage事件。

我们先看一下几个属性:

1、event.key 属性:属性值为在 session 或 localStorage 中被修改的数据键值。

2、event.oldValue 属性:属性值为在 sessionStorage 或 localStorage 中被修改的值。

3、event.newValue 属性:属性值为在 sessionStorage 或 localStorage 中被修改后的值

4、event.url 属性:属性值为修改 sessionStorage 或 localStorage 中值的页面的URL地址

5、event.storageArea 属性 : 属性值为被变动的 sessionStorage 对象或 localStorage 对象

引用《h5移动web开发指南》上的话:

“当同源页面的某个页面修改了localStorage,其余的同源页面只要注册了storage事件,就会触发”
所以,localStorage的例子运行需要如下条件:

同一浏览器打开了两个同源页面
其中一个网页修改了localStorage
另一网页注册了storage事件
很容易犯的错误是,在同一个网页修改本地存储,又在同一个网页监听,这样是没有效果的。

例子

接下来我们通过两个例子来体验一下。

实时监听的页面:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>利用storage事件实时监视Web Storage中的数据</title>
    </head>
    <body>
        <script type="text/javascript">
 
            //利用storage事件实时监视wev Storage中的数据
            window.addEventListener('storage',function (e) {//e只是一个传参
                //获取被修改的键值
                if (e.key == 'test') {
                    //获取将要被添加内容的元素
                    var output = document.getElementById('output');
                    //将获取到的修改值在元素中输出
                    output.innerHTML = '原有值:' + e.oldValue;
                    output.innerHTML += '<br />新值:' + e.newValue;
                    output.innerHTML += '<br />变动页面地址:' + utf8_decode(unescape(e.url));
 
                    //分别打印会发现内容一致
                    console.log(e.storageArea);
                    console.log(localStorage);
                    //此行代码只在Chrome浏览器中有效
                    console.log(e.storageArea === localStorage);//输出true
 
                }
            },false);
            function utf8_decode (utftext) {
                var string = '';
                var i = c = c1 = c2 = 0;
                //获取URL所有字符
                while (i < utftext.length) {
                    //获取URL并将URL中所有 Unicode 编码获取
                    c = utftext.charCodeAt(i);
                    //对 Unicode 编码进行处理转化成字符串
                    if (c < 128) {
                        string += String.fromCharCode(c);
                        i++;
                    }
                    else if ((c < 191) && (c < 224)) {
                        c2 = utftext.charCodeAt(i + 1);
                        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                        i += 2;
                    }
                    else {
                        c2 = utftext.charCodeAt(i + 1);
                        c3 = utftext.charCodeAt(i + 2);
                        string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                        i += 3;
                    }
                }
                return string;
            }
        </script>
        <output id="output"></output>
    </body>
</html>

修改localStorage中数据的页面:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>用于修改localStorage 中数据的页面的代码</title>
    </head>
    <body>
        <script type="text/javascript">
            function setLOcalStorage () {
                //设置test键值下的内容等于input框中的内容
                localStorage.test = document.getElementById('text1').value;
            }
        </script>
        请输入一些值:<input type="text" id="text1" />
        <button onclick="setLOcalStorage()">设置</button>
    </body>
</html>

实际效果:

image

代码中用到的函数:

charCodeAt()    可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。 
fromCharCode()  可接受一个指定的 Unicode 值,然后返回一个字符串。 
unescape()      可对通过 escape() 编码的字符串进行解码。

下面是关于Unicode码的一些注解:

Unicode只有一个字符集,中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分 
Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符, 比如汉字”经”的编码是
0x7ECF,注意字符码一般用十六进制来 表示,为了与十进制区分,十六进制以0x开头,0x7ECF
转换成十进制 就是32463,UCS-2用两个字节来编码字符,两个字节就是16位二进制, 2的16
次方等于65536,所以UCS-2最多能编码65536个字符。 编码从0到127的字符与ASCII编码的
字符一样,比如字母”a”的Unicode 编码是0x0061,十进制是97,而”a”的ASCII编码是0x61,
十进制也是97, 对于汉字的编码,事实上Unicode对汉字支持不怎么好,这也是没办法的, 简
体和繁体总共有六七万个汉字,而UCS-2最多能表示65536个,才六万 多个,所以Unicode只
能排除一些几乎不用的汉字,好在常用的简体汉字 也不过七千多个,为了能表示所有汉字,
Unicode也有UCS-4规范,就是用 4个字节来编码字符

扩展

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

<script>
    var orignalSetItem = localStorage.setItem;
    localStorage.setItem = function(key,newValue){
        var setItemEvent = new Event("setItemEvent");
        setItemEvent.key = key;
        setItemEvent.newValue = newValue;
        setItemEvent.oldValue = localStorage.getItem(key);
        window.dispatchEvent(setItemEvent);
        orignalSetItem.apply(this,arguments);
    }
    window.addEventListener("setItemEvent", function (e) {
        console.log('key: '+e.key);
        console.log('newValue: '+e.newValue);
        console.log('oldValue: '+e.oldValue);
    });
    localStorage.setItem("nm","1234");
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354