Storage事件无法触发解决

本文探讨了Web Storage在项目实践中的应用,尤其是localStorage.setItem()方法的异步问题。通过重新包装localStorage的setItem方法和动态创建iframe来触发Storage事件。针对Chrome下同一页面无法触发Storage事件的限制,提出了利用自定义事件和iframe的解决方案,实现了在页面内部监听localStorage的变化。
摘要由CSDN通过智能技术生成

Web Storage 项目实践

这段代码是从一个项目在摘出来的,主要实现了将一个图片利用canvas的toDataURL这个API转成BASE64编码的字符串(图片要先用drawImage画到canvas上),然后存储到localStorage中。 因为图片数据量大,经常加载会耗费时间,所以可以利用客户端存储缓存起来。 这几个图片主要是图标ICON。

/*Canvas transfer img to Base64 string 
Author:Jason
*/
define(function(){
   
    var createStorage=function(imgPath,ele){
   
        this.src=imgPath;//var src="xxx.jpg";
        this.ele=ele;
    }

    createStorage.prototype={
        set:function(key,imgType){
   
            var img=document.createElement('img');
            //img.setAttribute('crossOrigin','annonymous');
            //当图片加载完成时触发回调函数
            img.src=this.src;
            img.addEventListener('load',function(){
   
                var imgcanvas=document.createElement("canvas");
                var imgContext=imgcanvas.getContext("2d");
                imgcanvas.style.width="50px";//CANVAS大小
                imgcanvas.style.height="50px";
                //确保canvas元素的大小和图片尺寸一致
                //渲染图片到canvas中 定位以及宽高
                // context.drawImage(img,x,y,width,height);
                imgContext.drawImage(this,0,0,300,110);
                //用data url形式取出
                var imgAsDataURL=imgcanvas.toDataURL("image/"+imgType);

                //保存到本地存储中
                try{
                    localStorage.setItem(key,imgAsDataURL);//存到localstorage~!
                }catch(e){
                    console.log("Storage failed:"+e);
                }
            },false);

        },

        get:function(key){
   //从本地缓存取图片并渲染
            var flag=true;
            while((localStorage.getItem(key)===null)&&flag);
            //此处的flag是为了避免浏览器等待过长时间
            window.setTimeout(function(){
   
                flag=false;
            },3000);
            var srcStr=localStorage.getItem(key);
            var imgObj=document.createElement('img');
            imgObj.src=srcStr;
            imgObj.style.width="50px"; //这个会截断图片
            imgObj.style.height="60px";
            imgObj.style.marginLeft="20px";
            //document.body.appendChild(imgObj);
            this.ele.appendChild(imgObj);
        }
    }

    return{
        createStorage:createStorage
    }
});

上面的get方法中,用了一个while循环判断获取的键值是否为null。因为localStorage.getItem(key),如果这个key不存在,返回就是一个null值。 等到setItem成功之后才会返回一个键值。

这么做的原因:前面一篇文章也介绍过了,这个方法其实不同浏览器实现不同,IE是异步的,其他可能是同步的,我们无法保证这一点,而且经过测试Chrome貌似也不是同步的。

另一种做法:

因为while循环肯定是阻塞JS线程的, 利用storage事件来异步触发这个本地存储的读取即 get方法。
在浏览器开发工具的 Application栏可

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值