zoukankan      html  css  js  c++  java
  • h5新API之WebStorage解决页面数据通信问题

    localStorage相信大家都不陌生,今天我们要讨论的不是怎么存储数据,获取数据。而是看看WebStorage的一些妙用,相信大家在开发中遇到过这样一个场景,一个页面中嵌套一个iframe,iframe中填写了一些数据,关闭iframe后,需要通知页面中变化数据,或者触发某个事件。这个需求说难不难,说简单不简单,解决方式也是五花八门,读者可以在评论区留言。我要说的是,用storage事件机制来解决这个问题。

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

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

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

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

    很容易犯的错误是,在同一个网页修改本地存储,又在同一个网页监听,这样是没有效果的。

    例子

    网页A:监听了storage事件:

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <title>A</title>
    </head>
    <body>
        <h1 id="ss"></h1>
    <script>
        ss.innerHTML=localStorage.getItem("foo");
        window.addEventListener("storage", function (e) {
            ss.innerHTML=e.newValue;
        });
    </script>
    </body>
    </html>

    网页B:修改了localStorage

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <title>B</title>
    
    </head>
    <body>
        <div>
            <h3 id="aa">current value: 0</h3>
            <button id="cc">change</button>
        </div>
    
    <script>
        var i=0;
        cc.addEventListener("click",function(){
            localStorage.clear();
            aa.innerHTML="current value: "+i;
            localStorage.setItem('foo', i++);
        })
    </script>
    </body>
    </html>

    是不是很神奇?连个标签之间竟然产生了通信。

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <title>A</title>
    </head>
    <body>
        <h1 id="cc"></h1>
        <button id="change">change</button>
    <script>
        localStorage.setItem("xx","val");
        var val=localStorage.getItem("xx");
        cc.innerHTML=val;
        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) {
            cc.innerHTML=e.newValue;
        });
        change.addEventListener("click",function () {
            localStorage.setItem("xx","1234");
        })
    </script>
    </body>
    </html>

    这里用到了自定义事件,也是H5新增API

    通过iframe方式也可以达到目的

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <title>B</title>
    
    </head>
    <body>
        <div>
            <h3 id="aa">current value: 0</h3>
            <button id="cc">change</button>
        </div>
    
        <iframe src="a.html" frameborder="0"></iframe>
    <script>
        var i=0;
        cc.addEventListener("click",function(){
            localStorage.clear();
            aa.innerHTML="current value: "+i;
            localStorage.setItem('foo', i++);
        })
    </script>
    </body>
    </html>

  • 相关阅读:
    codeforces 1198B
    POJ 3177 Redundant Paths (tarjan边双连通分量)
    Geotrellis系列文章链接
    geotrellis使用(十一)实现空间数据库栅格化以及根据属性字段进行赋值
    geotrellis使用(十)缓冲区分析以及多种类型要素栅格化
    geotrellis使用(九)使用geotrellis进行栅格渲染
    geotrellis使用(八)矢量数据栅格化
    geotrellis使用(七)记录一次惨痛的bug调试经历以及求DEM坡度实践
    Parallel并行化编程
    geotrellis使用(六)Scala并发(并行)编程
  • 原文地址:https://www.cnblogs.com/zt123123/p/10272212.html
Copyright © 2011-2022 走看看