html5 storage事件

HTML5 虽然很多年了,但是真的了解不不够不够。主题说的是 storage时间,说起对 storage 事件的了解还是从 QQ音乐 说起。

QQ音乐的主页是 https://y.qq.com , 而实际播放的页面是 https://y.qq.com/portal/player.html。你在其他里面点击播放或者添加的时候,你会发现 https://y.qq.com/portal/player.html 会实时的变化。当前我想,这个神奇啊,

当前想法是如下,可是怎么想都比较low啊。

1. 存入 localStorage 或者 indexedDB里面,然后定期读取呢?

2. socket开启呢?

3. 中间服务中转呢?

曾有同事偶然间提到到storage事件,当时也上心。前两天无意中看到一篇  h5 storage事件监听 的文章。

顺便再去探究一下 QQ音乐。

点击播放歌曲的时候,在player.html页面即播放页面捕获的数据。这就完全验证了 QQ音乐这个添加音乐的实现就是基于 storage事件来完成的。

那么我们先来看一下, storage event的定义  The storage event。 简单就是说 session storage 和 local storage 的值变化的时候,会触发该事件。

The storage event is fired on a Document‘s Window object when a storage area changes, as described in the previous two sections (for session storagefor local storage).

When a user agent is to send a storage notification for a Document, the user agent must queue a task to fire an event named storage at the Document object‘s Windowobject, using StorageEvent.

怎么使用呢:

A页面

window.addEventListener("storage", function (e) {
        console.log(e)
    });

B 页面

 localStorage.setItem(‘key1‘, ‘vakue1‘)

B页面执行这段代码的时候, A页面就会打出e整个对象。

我们看一下e究竟有哪些属性或者方法,注意标红的五个属性,其实的都是普通事件都有的属性,

  key: 不用解释,更新的属性名

newValue: 新值

oldValue : 旧值

storageArea:  我这里理解就是localStorage的值

url: 触发该事件的网址

这里有两点:

1.  当localStorage调用 setItem, removeItem ,clear方法的时候,调用的页面本身是不会触发storage事件的。

2. 如果想调用页面也能监听localStorage的变化,可以像如下,当然removeItem ,clear方法也得重写。显得有点麻烦

   var _setItem = localStorage.setItem;
    localStorage.setItem = function(key,newValue){
        var setItemEvent = new Event("setItemEvent");
        setItemEvent.newValue = newValue;
        window.dispatchEvent(setItemEvent);
        _setItem .apply(this,arguments);
    }
    window.addEventListener("setItemEvent", function (e) {
        console.log(e)
    });
    localStorage.setItem("key1","value1");

当然,我自己也用过另外一种方式, 这种方法,遗憾的是, localStorage被代理,导致 ls调用方法都会报错,导致 ls现在是一个对象了。

        var ls = new Proxy(localStorage, {
            get: function (target, key, receiver) {
                var val = Reflect.get(target, key, receiver)
                return val && JSON.parse(val)
            },
            set: function (target, key, value, receiver) {

                var evt = document.createEvent(‘StorageEvent‘);
                evt.initStorageEvent(‘storage‘, false, false, key, window.localStorage.getItem(key), value, window.location.href, window.localStorage);
                window.dispatchEvent(evt);

                return Reflect.set(target, key, value && JSON.stringify(value), receiver)

            },
            deleteProperty: function (target, key) {

                var evt = document.createEvent(‘StorageEvent‘);
                evt.initStorageEvent(‘storage‘, false, false, key, window.localStorage.getItem(key), null, window.location.href, window.localStorage);
                window.dispatchEvent(evt)

                Reflect.deleteProperty(target, key)
            }
        })

        window.addEventListener(‘storage‘, function (e) {
            console.log(e)
        })

        ls.a = 2
        delete ls.a

已知的一些问题:

  1. Storing large amounts of data in Safari (on OSX & iOS) can result in freezing the browser see bug
  2. IE10 in Windows 8 has an issue where localStorage can fail with the error message "SCRIPT5: Access is denied" if "integrity" settings are not set correctly. see details
  3. Internet Explorer does not support storing most of the ASCII characters with codes under x20.
  4. The "storage" event is completely wrong in IE: 
    IE10 : The storage event is fired even on the originating document where it occurred. Causes problems with multiple windows websites, and huge problems with iframes.
    IE11 : The storage event‘s oldValue and newValue are identical (newValue is supposed to contain the storage‘s updated value). 

    Partial workaround: regularly probe the storage‘s value and compare with the last known value on all pages where you want to listen to this event, and track the last submitted value to determine if the modification was triggered locally.

  5. In IE attempting to access localStorage on HTML files served from the file system results in the localStorage object being undefined
  6. In iOS 5 & 6 localStorage data is stored in a location that may occasionally be cleared out by the OS.
  7. In private browsing mode, Safari and iOS Safari up to including version 10.x as well as the Android browser (not include Chrome for Android) do not support setting sessionStorage or localStorage.
  8. IE 8 and 9 store data based only on hostname, ignoring the scheme (http vs https) and port number as required by the specification.

参考:

The storage event

StorageEvent

初试WebStorage之localstorage

Can I Use LocalStorage

initStorageEvent method

时间: 2024-12-27 22:00:11

html5 storage事件的相关文章

html5客户端本地存储之sessionStorage及storage事件

首先您可以看一下<JavaScript本地存储实践(html5的localStorage和ie的userData)>sessionStorage和上文中提到的localStorage非常相识,方法也几乎一样: 非常通俗易懂的接口: sessionStorage.getItem(key):获取指定key本地存储的值sessionStorage.setItem(key,value):将value存储到key字段sessionStorage.removeItem(key):删除指定key本地存储的值

localStorage、sessionStorage详解,以及storage事件使用

有关localStorage和sessionStorage的特性. localStorage本身带有方法有 添加键值对:localStorage.setItem(key,value),如果key存在时,更新value. 获取键值:localStorage.getItem(key),如果key不存在返回null. 删除键值对:localStorage.removeItem(key).key对应的数据将会全部删除. 清除所有键值对:localStorage.clear().如果调用clear()方法

localStorge之storage事件

随着h5的流行和mobile开发,localStorage已经不再是个陌生词,相信大多数童鞋都已经接触过它并用过,但是storage事件相信还是有很多童鞋不太明白甚至没接触过,今天我们主要聊聊storage. 先看w3c关于storage都描述: 4.4 The storage event The storage event is fired when a storage area changes, as described in the previous two sections (for s

(一)html5 touch事件实现页面上下滑动

最近做的做那个app的项目由于用overflow:hidden导致了很多问题,于是决定研究下html5的touch事件.想找个全面点的帖子真是难死了,虽然好多关于html5 touch的文章但大多都是介绍touch事件或者很简短的小demo. 下午好生研究了下终于搞出了个比较全面的上下滑动的小demo,代码比较简单. 下面是完整代码,我把几个重要的地方做了红色标记 <!doctype html> <html lang="en"> <head> <

关于windows phone 8.1系统手机对html5触摸事件的支持情况

近日购入一部微软Lumia 640手机,目的主要就是为了测试年中开发完成的响应式移动web项目,同时也为了将来升级win10 mobile系统.由于我们的项目目前只考虑支持IOS与Android系统,所以只支持了html5触摸事件(如touchstart). 印象中WP系统应该只支持MS开头(如MSPointerDown)的指针事件,但测试结果很出人意料:项目在WP8.1的Lumia 640手机上竟完全可以正常运行,并支持了所有的触摸事件... 对于这个问题我挺不解的,于是就查阅了下msdn文档

storage 事件监听

在公司的一次内部分享会上, 偶然知道了这个H5的新事件, 解决了我之前的一个bug. 事情是这样的, 第A网页上显示的数量的总和, 点击去是B页面, 可以进行管理, 增加或者删除, 当用户做了增删操作之后, 返回到A页面的时候不会更新数量, 这个问题困扰了很久 终于等到storage事件, 据说淘宝的购物车就是这么实现的 所以, localStorage的例子运行需要如下条件 同一个浏览器打开了两个同源网页 其中一个网页修改了localStorage 另一个网页注册了storage事件 例子 A

localstorage 更新监测 storage事件

1.存储更新监测 存储状态监测的原理是storage事件.storage事件说明: https://developer.mozilla.org/zh-CN/docs/Web/API/StorageEvent storage事件是注册在window上的. 2.示例 同域下2个文件,分别为test.html和test1.html. test.html文件为: <!DOCTYPE html> <html lang="zh"> <head> <meta

html5触摸事件tap演化

触摸事件是移动浏览器特有的HTML5事件,虽然click事件在pc和移动端更通用,但是在移动端会出现300ms延迟,较为影响用户体验,300ms延迟来自判断双击和长按,因为只有默认等待时间结束以确定没有后续动作发生时,才会触发click事件.所以触摸事件反应更快,体验更好. 触摸事件的类型: 为了区别触摸相关的状态改变,存在多种类型的触摸事件.可以通过检查触摸事件的 TouchEvent.type 属性来确定当前事件属于哪种类型.注意: 在很多情况下,触摸事件和鼠标事件会同时被触发(目的是让没有

Storage事件及综合案例

说到Storage事件,那么就得先给大家说一下localstorage和sessionstorage: 1.localStorage和sessionStorage一样都是用来存储客户端临时信息的对象. 2.他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器对其进行实现). 3.localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在. 4.sessionStorage生命周期