实现原理:

HTML5 的 postMessage 为解决跨域页面通信提供了一套可控的机制, 而 localStorage 则提供了易用简洁的本地存储方案? 这两者结合起来,能否实现跨域的本地存储呢 ?

答案是可以的。假设有 a.com 和 b.com 两个页面。我们想通过 a 页面去修改 b 页面的本地数据。 我们需要做如下步奏:

  • 在 a 页面创建一个 iframe ,嵌入 b 页面
  • a 页面通过 postMessage 传递指定格式的消息给 b 页面
  • b 页面解析 a 页面传递过来的消息内容,调用localStorage API 操作本地数据
  • b 页面包装 localStorage 的操作结果,并通过 postMessage 传递给 a 页面
  • a 页面解析 b 页面传递回来的消息内容,得到 localStorage 的操作结果

下面简单的实现一下:

在A页面:

 /*
API:
csclient.get("http://b.test.com","name",callback);
csclient.set("http://b.test.com","name","chenjian",callback);
csclient.del("http://b.test.com","name",callback);
*/
var csclient = (function () {
var _get = function (url,key,fn) {
var value = {
_key :key,
_method : "get"
};
getIframeWindow(url).postMessage(value,url);
//给window对象绑定message事件处理
addEvent(handMessage)
} var _set = function (url,key,value,fn) {
var _value = {
_key : key,
_vaule :value,
_method : "set"
};
getIframeWindow(url).postMessage(_vaule,url);
//给window对象绑定message事件处理
addEvent(handMessage)
} var _del = function () function (url,key,fn) {
var value = {
_key :key,
_method : "del"
};
getIframeWindow(url).postMessage(_vaule,url);
//给window对象绑定message事件处理
addEvent(handMessage)
} function getIframeWindow (url) {
var _iframe = document.createElement("iframe");
_iframe.src = url;
_iframe.style.display = "none";
window.body.appendChild(_iframe);
var iframeWindow = _iframe.contentWindow;
return iframeWindow;
}
function addEvent(func) {
if (window.addEventListener) {
window.addEventListener("message", func, false);
}else{
window.attachEvent("onmessage", func);
}
}
function handMessage (event) {
var event = event || window.event;
//验证是否来自预期内的域,如果不是不做处理,这样也是为了安全方面考虑
if(event.origin === url){
//处理传过来的数据;
fn(event.data);
}
}
return {
get : _get,
set : _set,
del : _del
}
})();

在B页面:

 /*
API:
cshub.init("http://a.test.com");
*/
var cshub = (function () {
var _cshub = function (url) {
addEvent(handMessage);
function handMessage(event) {
var event = event || window.event;
//验证是否来自预期内的域,如果不是不做处理,这样也是为了安全方面考虑
if(event.origin === url){
if(event.data._method=="get") {
getFn(event.data._method)
}else if (event.data._method=="set") {
setFn(event.data._method)
}else {
delFn(event.data._method)
}
}
}
function addEvent(func) {
if (window.addEventListener) {
window.addEventListener("message", func, false);
}else{
window.attachEvent("onmessage", func);
}
} function getFn (data) {
window.parent.postMessage(window.localStorage["data._key"],url);
} function setFn (data) {
window.localStorage["data._key"] = data._value;
window.parent.postMessage("设置成功");
} function delFn (data) {
window.localStorage.removeItem("data._key");
window.parent.postMessage("删除成功");
}
}
return {
init : _cshub
};
})();

上面的代码徒手写的没做测试,如果有误还望指出。谢谢

localStorage的跨与实现方案的更多相关文章

  1. H5中用postMessage传递数据,解决localStorage不能跨域问题

    localStorage不能跨域,所以在A域名下用localStorage.YourKey方式存储的值,在B域名下是不能取到的. 所以需要转变思路,目前主要使用的两种方式: 一种方式:在A.B两个页面 ...

  2. SNF快速开发平台MVC-EasyUI3.9之-WebApi跨域处理方案

    在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案.由于时间有限,本文不会深入. 笔者遇到的问题是Js调用WebAPI中的数据进行跨域的场景.涉及若干跨域方案:目前采用we ...

  3. Kafka 跨集群同步方案(转)

    来自:http://tangzhaohui.net/524 Kafka 跨集群同步方案——Kafka内置的MirrorMaker工具 该方案解决Kafka跨集群同步.创建Kafka集群镜像等相关问题, ...

  4. Docker系列04—跨主机网络方案(overlay/weave)

    在前面详细讲解了几种网络模式:none,host,bridge,container.他们解决了单个主机间的容器的通信问题,并不能实现多个主机容器之间的通信. 跨主机网络方案包括两大类: 1,docke ...

  5. Docker 跨主机网络方案分析

    PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...

  6. MongoDB集群跨网络、跨集群同步方案

    MongoDB集群跨网络.跨集群数据同步有以下几个方案,此处只是简单介绍,不过详细描述. 1.MongoDB自带的复制方案 优点:实施简单,不需要额外的技术栈 缺点:网络双向可连通. 2.CDC同步方 ...

  7. Django解决跨域俩方案

    方案一:一套干掉全部Primary 首先你的pip下载一个第三方库贼厉害的: pip install corsheaders 然后在项目的setting.py里面引入第三方库,如下: INSTALLE ...

  8. iframe跨域通信方案

    概述 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首先什么 ...

  9. 解决浏览器跨域限制方案之CORS

    一.什么是CORS CORS是解决浏览器跨域限制的W3C标准,详见:https://www.w3.org/TR/cors/. 根据CORS标准的定义,在浏览器中访问跨域资源时,需要做如下实现: 服务端 ...

随机推荐

  1. iOS多线程总结

    1.不要同时开太多的线程(1~3条线程即可,不要超过5条) 2.线程概念 1> 主线程 : UI线程,显示.刷新UI界面,处理UI控件的事件 2> 子线程 : 后台线程,异步线程 3.不要 ...

  2. Visual Studio 2012 主题下的代码配色方案

    默认的VS2012的深色配色方案个人感觉很丑,不是很好看,于是就自己动手配置了一下,突出语法高亮显示,增加代码语法识别度,个人感觉还是可以的. 原来使用的是VAX,但自从VAX导致的我的VS不能输入中 ...

  3. (3)HTML ”列表“、图片和超链接

    本节解说 1. html支持的列表:无序列表.有序列表.定义列表 2. html中如何插入图片 3.html的超链接 <1> 无序列表 无序列表是一个项目的列表,此列项目使用粗体圆点(典型 ...

  4. Apache与Tomcat 区别联系

    Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP.Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置. Apache是web服 ...

  5. CSS去除链接虚线(兼容IE6、IE7)

    在css里加入以下代码: a{    hide-focus: expression( this.hideFocus=true );    outline: none;}

  6. influxdb ERR: error parsing query: found -, expected

    ERR: error parsing query: found -, expected 使用时遇到这个问题,执行语句: select * FROM test10-cc-core01 本来以为和sql语 ...

  7. Android学习笔记(四十):Preference的使用

    Preference直译为偏好,博友建议翻译为首选项.一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择.Android提供preferenc ...

  8. android获取/更改gps和WIFI状态

    一.WIFI状态的获取和更改 适用于 SDK1.0 , SDK1.5 1.获取WIFI状态 方法1:通过WifiManager进行操作 1WifiManager wifiManager = (Wifi ...

  9. Topcomponent --sighoff

    Topcomponent --sighoff 实现一个置于右边框的Topcomponent: 1.可远程同步更新(根据远程的xml文件),修改(增删)该xml文件,查看.刷新等 2.打包工程,记录该打 ...

  10. HDU 4876 ZCC loves cards(暴力剪枝)

    HDU 4876 ZCC loves cards 题目链接 题意:给定一些卡片,每一个卡片上有数字,如今选k个卡片,绕成一个环,每次能够再这个环上连续选1 - k张卡片,得到他们的异或和的数,给定一个 ...