实现原理:

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. UI:target-action设计模式、手势识别器

    ⼀.target/action设计模式 ⼆.代理设计模式 三.UIImageView 四.⼿势识别器 target/action设计模式 耦合是衡量⼀个程序写的好坏的标准之⼀, 耦合是衡量模块与模块之 ...

  2. Apache实现动态虚拟主机

    经常在开发中为Apache web server添加虚拟主机  方便多个项目的 同时运营,但是每次增加新的项目时都得重新配置增加VirtualHost:虚拟主机    部分,时间久了VirtualHo ...

  3. CloudStack4.2 更新全局参数API

    测试更新全局参数API http://192.168.153.34:8080/client/api?command=updateConfiguration&response=json& ...

  4. c#获取或修改配置文件

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...

  5. PostgreSQL停止动作观察

    实验过程如下: 启动一个客户端: [postgres@cnrd56 bin]$ ./psql psql () Type "help" for help. postgres=# be ...

  6. PowerShell管理Exchange

    #添加Exchange管理单元get-pssnapin -registeredadd-pssnapin microsoft.exchange* #启用邮箱账号(需要域管理员权限,因为需要将某些属性写入 ...

  7. EXchange2010配置

    DAG配置: 组织配置:如果见证服务器是DC不是exchange服务器,那么需要在AD用户和计算机里面,将exchange trusted subsystem 添加到 DC的本地管理员组(/built ...

  8. IOS 手机助手及越狱助手推荐

    快装系列 1 快装助手(PC版) http://pc.kuaiapp.cn/ 2 快装越狱助手(PC版)http://www.kuaiapp.cn 3 快装商店(手机版)http://yueyu.ku ...

  9. C++学习笔记之数据类型

    一.变量名 几条简单的C++命名规则: 在名称中只能使用字母,数字和下划线 名称的第一个字符不能是数字 区分大小写 不能将C++关键字用作名称 以两个下划线和大写字母打头的名称被保留给实现(编译器及其 ...

  10. windows下安装,配置gcc编译器

    在Windows下使用gcc编译器: 1.首先介绍下MinGW MinGW是指仅仅用自由软件来生成纯粹的Win32可运行文件的编译环境,它是Minimalist GNU on Windows的略称. ...