html5的localStorage相信大家都是很熟悉了,但是在chrome等支持该对象的浏览器中(ie10除外),如果你监听 storage变更事件你就会发现,当数据发生变化时本页是监听不到storage事件变更消息的。而同域的其他打开的页面反而监听到了该消息。悲剧不?

以上的机制应该是无可厚非的,但是对于单页app或者数据驱动的页面展现来说,这是一个让人抓狂的规事情。awen在开发中为了实现一个纯数据驱动的单页app机制。不得不面对这个问题,经过测试终于实现了本页面locaStorage变更监听。

基本原理如下:

1  重新生成一个对象,包装localStorage原生方法:

var Storage = {
setItem : function(k,v){
  localStorage.setItem(k,v);
  ......
},
removeItem : function(k){
  localStorage.removeItem(k);
.......
},
getItem :
...
}

2 在能引起storage变更时间的操作接口中,手动触发StorageEvent事件

  比如removeItem的实现中,你就需要初始化并触发StorageEvent事件:

var se = document.createEvent("StorageEvent");
se.initStorageEvent('storage', false, false, key, oldval, newval, url, storage);
window.dispatchEvent(se);

3 通过自封装的Storage对象操作,并在当前页监听:

window.addEventListener("storage",function(e){
console.log(e);
},false); Storage.addItem('test','小朋友爱吃糖');

到此为止。StorageEvent的当前页面监听问题就解决了,爽不?

转载:http://www.cnblogs.com/cczw/p/3196195.html

HTML5 localStorage and sessionStorage

HTML5 提供两种web存储方法,localStorage 与 sessionStorage

localStorage 与 sessionStorage 区别

localStorage没有过期时间,只要不clear或remove,数据会一直保存。

sessionStorage 针对一个session进行数据存储,生命周期与session相同,当用户关闭浏览器后,数据将被删除。

特点:

1.localStorage 默认支持的容量为一个站5M,当调用setItem超过上限时,会触发QuotaExceededError异常。当然有些浏览器支持修改容量上限,但为了兼容其他浏览器,最好按5M的容量来使用。

2.localStorage 是以key-value形式保存数据的,key和value只能是字符串格式。因此数字1保存后,会转换成字符串1。

3.localStorage 的写入与读取写法有以下几种:

localStorage.name = 'fdipzone';
name = localStorage.name; localStorage['name'] = 'fdipzone';
name = localStorage['name']; localStorage.setItem('name', 'fdipzone');
name = localStorage.getItem('name');

localStorage[key] = value写法主流浏览器都支持,官方并没有说明那一种写法是标准。但如果执行以下的代码就使localStorage失效。

localStorage.setItem = null;
localStorage.getItem = null;
localStorage.removeItem = null;
localStorage.clear = null;

因此,建议使用setItem(), getItem(), removeItem(), clear()来实现写入,读取,删除,清空。

4.如果要保存非字符串的内容,建议使用JSON来处理。写入数据时用JSON.stringify转成字符串,读取数据时用JSON.parse把字符串转为之前的格式。

例子1:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title> Local Storage and Session Storage </title>
</head> <body>
<p>姓名:<input type="text" name="name" id="name"></p>
<p>性别:<input type="radio" name="gender" id="gender1" value=""> 男 <input type="radio" name="gender" id="gender2" value=""> 女</p>
<p><input type="button" id="saveBtn" value="save"> <input type="button" id="getBtn" value="get"> <input type="button" id="removeBtn" value="remove name"> <input type="button" id="clearBtn" value="clear"> </p> <script type="text/javascript">
var oStorage = window.localStorage; function $(id){
return document.getElementById(id);
} // 保存数据
$('saveBtn').onclick = function(){
oStorage.setItem('name', $('name').value); if($('gender1').checked==true){
oStorage.setItem('gender', );
}else if($('gender2').checked==true){
oStorage.setItem('gender', );
}
} // 获取数据
$('getBtn').onclick = function(){
$('name').value = oStorage.getItem('name');
if(oStorage.getItem('gender')==){
$('gender1').checked = true;
}else if(oStorage.getItem('gender')==){
$('gender2').checked = true;
}
} // 删除数据name
$('removeBtn').onclick = function(){
oStorage.removeItem('name');
} // 清空数据
$('clearBtn').onclick = function(){
oStorage.clear();
} </script> </body>
</html>

例子2:使用 JSON.stringify 和 JSON.parse 封装数据

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title> Local Storage and Session Storage </title>
</head> <body>
<p>姓名:<input type="text" name="name" id="name"></p>
<p>性别:<input type="radio" name="gender" id="gender1" value=""> 男 <input type="radio" name="gender" id="gender2" value=""> 女</p>
<p><input type="button" id="saveBtn" value="save"> <input type="button" id="getBtn" value="get"> <input type="button" id="clearBtn" value="clear"> </p> <script type="text/javascript">
var oStorage = window.localStorage; function $(id){
return document.getElementById(id);
} // 保存数据
$('saveBtn').onclick = function(){
var name = $('name').value;
var gender;
if($('gender1').checked==true){
gender = ;
}else if($('gender2').checked==true){
gender = ;
} var data = {};
data['name'] = name;
data['gender'] = gender; oStorage.setItem('data', JSON.stringify(data));
} // 获取数据
$('getBtn').onclick = function(){
var data = JSON.parse(oStorage.getItem('data')); if(data){
var name = data['name'];
var gender = data['gender']; $('name').value = name; if(gender==){
$('gender1').checked = true;
}else if(gender==){
$('gender2').checked = true;
}
}
} // 清空数据
$('clearBtn').onclick = function(){
oStorage.clear();
} </script> </body>
</html>

监听localStorage的值,当发生变化时同步页面数据

当调用setItem(), removeItem(), clear() 时,可以监听这些事件,方便不同的页面之间更新数据。

    // 监听数据变化,当数据发生变化时,同步数据显示
window.onstorage = function(event){
var status = {}
status.key = event.key;
status.oldValue = event.oldValue;
status.newValue = event.newValue;
status.url = event.url;
status.storage = event.storageArea; // 执行同步数据处理...
}

页面数据同步例子:

localStorage1.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title> Local Storage and Session Storage </title>
</head> <body>
<p>姓名:<input type="text" name="name" id="name"></p>
<p>性别:<input type="radio" name="gender" id="gender1" value=""> 男 <input type="radio" name="gender" id="gender2" value=""> 女</p>
<p><input type="button" id="saveBtn" value="save"> <input type="button" id="getBtn" value="get"> <input type="button" id="clearBtn" value="clear"> </p> <script type="text/javascript">
var oStorage = window.localStorage; function $(id){
return document.getElementById(id);
} // 保存数据
$('saveBtn').onclick = function(){
var name = $('name').value;
var gender;
if($('gender1').checked==true){
gender = ;
}else if($('gender2').checked==true){
gender = ;
} var data = {};
data['name'] = name;
data['gender'] = gender; oStorage.setItem('data', JSON.stringify(data));
} // 获取数据
$('getBtn').onclick = function(){
getStorageItem();
} // 获取数据
function getStorageItem(){
var data = JSON.parse(oStorage.getItem('data'));
var name,gender; if(data){
name = data['name'];
gender = data['gender'];
}else{
name = '';
gender = ;
} $('name').value = name; if(gender==){
$('gender1').checked = true;
}else if(gender==){
$('gender2').checked = true;
}else{
$('gender1').checked = false;
$('gender2').checked = false;
}
} // 清空数据
$('clearBtn').onclick = function(){
oStorage.clear();
$('name').value = '';
$('gender1').checked = false;
$('gender2').checked = false;
} // 监听数据变化,当数据发生变化时,同步数据显示
window.onstorage = function(event){
var status = {}
status.key = event.key;
status.oldValue = event.oldValue;
status.newValue = event.newValue;
status.url = event.url;
status.storage = event.storageArea; getStorageItem(); // 数据发生变化时,重新获取数据
} </script> </body>
</html>

localStorage2.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title> Local Storage and Session Storage </title>
</head> <body>
<p>姓名:<input type="text" name="name" id="name"></p>
<p>性别:<input type="radio" name="gender" id="gender1" value=""> 男 <input type="radio" name="gender" id="gender2" value=""> 女</p>
<p><input type="button" id="saveBtn" value="save"> <input type="button" id="getBtn" value="get"> <input type="button" id="clearBtn" value="clear"> </p> <script type="text/javascript">
var oStorage = window.localStorage; function $(id){
return document.getElementById(id);
} // 保存数据
$('saveBtn').onclick = function(){
var name = $('name').value;
var gender;
if($('gender1').checked==true){
gender = ;
}else if($('gender2').checked==true){
gender = ;
} var data = {};
data['name'] = name;
data['gender'] = gender; oStorage.setItem('data', JSON.stringify(data));
} // 获取数据
$('getBtn').onclick = function(){
getStorageItem();
} // 获取数据
function getStorageItem(){
var data = JSON.parse(oStorage.getItem('data'));
var name,gender; if(data){
name = data['name'];
gender = data['gender'];
}else{
name = '';
gender = ;
} $('name').value = name; if(gender==){
$('gender1').checked = true;
}else if(gender==){
$('gender2').checked = true;
}else{
$('gender1').checked = false;
$('gender2').checked = false;
}
} // 清空数据
$('clearBtn').onclick = function(){
oStorage.clear();
$('name').value = '';
$('gender1').checked = false;
$('gender2').checked = false;
} // 监听数据变化,当数据发生变化时,同步数据显示
window.onstorage = function(event){
var status = {}
status.key = event.key;
status.oldValue = event.oldValue;
status.newValue = event.newValue;
status.url = event.url;
status.storage = event.storageArea; getStorageItem(); // 数据发生变化时,重新获取数据
} </script> </body>
</html>

localstorage3.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title> Local Storage and Session Storage </title>
</head> <body>
<p>姓名:<input type="text" name="name" id="name"></p>
<p>性别:<input type="radio" name="gender" id="gender1" value=""> 男 <input type="radio" name="gender" id="gender2" value=""> 女</p>
<p><input type="button" id="saveBtn" value="save"> <input type="button" id="getBtn" value="get"> <input type="button" id="clearBtn" value="clear"> </p> <script type="text/javascript">
var oStorage = window.localStorage; function $(id){
return document.getElementById(id);
} // 保存数据
$('saveBtn').onclick = function(){
var name = $('name').value;
var gender;
if($('gender1').checked==true){
gender = ;
}else if($('gender2').checked==true){
gender = ;
} var data = {};
data['name'] = name;
data['gender'] = gender; oStorage.setItem('data', JSON.stringify(data));
} // 获取数据
$('getBtn').onclick = function(){
getStorageItem();
} // 获取数据
function getStorageItem(){
var data = JSON.parse(oStorage.getItem('data'));
var name,gender; if(data){
name = data['name'];
gender = data['gender'];
}else{
name = '';
gender = ;
} $('name').value = name; if(gender==){
$('gender1').checked = true;
}else if(gender==){
$('gender2').checked = true;
}else{
$('gender1').checked = false;
$('gender2').checked = false;
}
} // 清空数据
$('clearBtn').onclick = function(){
oStorage.clear();
$('name').value = '';
$('gender1').checked = false;
$('gender2').checked = false;
} // 监听数据变化,当数据发生变化时,同步数据显示
window.onstorage = function(event){
var status = {}
status.key = event.key;
status.oldValue = event.oldValue;
status.newValue = event.newValue;
status.url = event.url;
status.storage = event.storageArea; getStorageItem(); // 数据发生变化时,重新获取数据
} </script> </body>
</html>

点击下载查看

转载:http://blog.csdn.net/fdipzone/article/details/25517615

参考:http://www.smashingmagazine.com/2010/10/local-storage-and-how-to-use-it/

HTML5 Web Storage用法参考:

http://justcoding.iteye.com/blog/2092992

HTML5 本地存储参考

http://www.cnblogs.com/rainman/archive/2011/06/22/2086069.html

localStorage变更事件当前页响应新解的更多相关文章

  1. localStorage变更事件当前页响应新解-awen

    html5的localStorage相信大家都是很熟悉了,但是在chrome等支持该对象的浏览器中(ie10除外),如果你监听storage变更事件你就会发现,当数据发生变化时本页是监听不到stora ...

  2. ie6下:png图片不透明 和 背景图片为png的节点的内部标签单击事件不响应

    1.png图片不透明 少量图片时:使用滤镜: _background:none; _filter:prodig:DXImageTransform.Microsoft.AlphaImageLoader( ...

  3. XE7 - Image的双击事件无响应,咋整?(已解决)

    今天折腾了好一会,本想做个类似于手机相册的功能,显示SQLite数据库中的图片,然后继续做一些处理.哪成想,写个测试例子时就被卡住了:简单的往窗体上拖放了一个TImage和一个TLabel,没有修改任 ...

  4. 事件分发&响应链

    iOS的三种事件:触摸事件/运动事件/远程控制事件 typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteCon ...

  5. android学习之4种点击事件的响应方式

    如题,下面就一一列出对点击事件响应的4种方式: 第一种:内部类的形式: package com.example.dail; import android.net.Uri; import android ...

  6. WPF: 在 MVVM 设计中实现对 ListViewItem 双击事件的响应

    ListView 控件最常用的事件是 SelectionChanged:如果采用 MVVM 模式来设计 WPF 应用,通常,我们可以使用行为(如 InvokeCommandAction)并结合命令来实 ...

  7. Android软键盘事件imeOptions响应

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 在android发开过程中,有时候需要对EditText的软键盘进行监听. 当点击软键盘回车位置按键的时候,需要实现 完成.前进.下 ...

  8. ArcGIS Construction Tool OnSketchFinished事件不响应

    使用ArcGIS AddIN ConstructionTool做东西,绘制完Sketch之后,OnSketchFinished事件不响应,没有任何异常与错误. 1.初步问题:OnSketchFinis ...

  9. iOS开发 - 事件传递响应链

    序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UI ...

随机推荐

  1. iOS uiscrollView 嵌套 问题 的解决

    苹果官方文档里面提过,最好不要嵌套scrollView,特别提过UITableView和UIWebView,因为在滑动时,无法知道到底是希望superScrollView滑动还是subScrollVi ...

  2. 控制反转(IoC)

          大量使用工厂模式引起的问题:       Client 对象需要使用 Service1 的 execute( ) 方法完成特定功能,而 Service1 的实现 Service1Impe类 ...

  3. git 删除已经 add 的文件

    使用 git rm 命令即可,有两种选择, 一种是 git rm --cached "文件路径",不删除物理文件,仅将该文件从缓存中删除: 一种是 git rm --f " ...

  4. Hessian矩阵

    http://baike.baidu.com/link?url=o1ts6Eirjn5mHQCZUHGykiI8tDIdtHHOe6IDXagtcvF9ncOfdDOzT8tmFj41_DEsiUCr ...

  5. PHP删除符合条件的整个目录

    <?php /** * @name delFile函数与delDir函数一起使用, 删除符合条件的整个目录 * @param string $path 指定操作路径 * @return null ...

  6. Linux下MySQL主从同步配置

    Centos6.5 MySQL主从同步 MySQL版本5.6.25 主服务器:centos6.5 IP:192.168.1.101 从服务器:centos6.5 IP:192.168.1.102 一. ...

  7. Java基础--访问权限控制符

    今天我们来探讨一下访问权限控制符. 使用场景一:攻城狮A编写了ClassA,但是他不想所有的攻城狮都可以使用该类,应该怎么办? 使用场景二:攻城狮A编写了ClassA,里面有func1方法和func2 ...

  8. 在Mac OS X上安装Ionic

    安装xcode(从app store下载,用于编译调试ios平台app) 安装node.js(npm) 安装ionic(sudo npm install -g ionic) 安装cordova(sud ...

  9. GitHub之上传文件

    github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.对于一般人来说公共仓库就已经足够了,而且我们也没多少代码来管理,O(∩_∩)O ...

  10. git merge 到 非当前 branch

    1. Add a remote alias for your local repository, ex: git remote add self file:///path/to/your/reposi ...