日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈postMessage跨域通信与localStorage实现跨域共享

發(fā)布時間:2025/4/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈postMessage跨域通信与localStorage实现跨域共享 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們可能有需要在多個域名之間共用同一個localStorage的需要

一、我們先測試不同域名之間的通信

  1.有 child.html 如下,代碼中?window.parent.postMessage(data,origin)?方法允許來自不同源的腳本采用異步方式進行通信,可以實現(xiàn)跨文本檔、多窗口、跨域消息傳遞。接受兩個參數:

  • data:要傳遞的數據,html5規(guī)范中提到該參數可以是JavaScript的任意基本類型或可復制的對象,然而并不是所有瀏覽器支持任意類型的參數,部分瀏覽器只能處理字符串參數,所以在傳遞參數時需要使用JSON.stringify()方法對對象參數序列化。
  • origin:字符串參數,指明目標窗口的源,協(xié)議+主機+端口號[+URL],URL會被忽略,所以可以不寫,只是為了安全考慮,postMessage()方法只會將message傳遞給指定窗口,當然也可以將參數設置為"*",這樣可以傳遞給任意窗口,如果要指定和當前窗口同源的話設置為"/"。
<!doctype html> <html> <head> <style type="text/css"> html,body{ height:100%; margin:0px; } </style> </head> <body style="height:100%;"> <div id="container" onclick="changeColor();" style="widht:100%; height:100%; background-color:rgb(204, 102, 0);"> click to change color </div> <script type="text/javascript"> var container = document.getElementById('container'); // iframe接收消息,并把當前顏色發(fā)送給主頁面 changeColor();// 點擊iframe時觸發(fā)changeColor方法,把變化后的顏色發(fā)送給主頁面 function changeColor() { var color = container.style.backgroundColor; if (color == 'rgb(204, 102, 0)') color = 'rgb(204, 204, 0)'; else color = 'rgb(204,102,0)'; container.style.backgroundColor = color;console.log('start post color ..............');window.parent.postMessage(color, '*'); } </script> </body> </html>

?

  2.然后在 main.html 中引入 child.html,window.addEventListener('message', function(e) { dosomething....}, false);? 用來監(jiān)聽iframe 中發(fā)過來的消息

<!DOCTYPE html> <html> <head> <title></title> </head> <body> <div style="width:200px; float:left; margin-right:200px;border:solid 1px #333;"> <div id="color">Frame Color</div> </div> <div> <iframe id="child" src="http://www.abc.com/child.html"></iframe> </div> <script type="text/javascript"> // 主頁面監(jiān)聽message事件,初始化自身顏色 // 主頁面監(jiān)聽message事件,處理自身變色 window.addEventListener('message', function(e) {console.log('listen.....');var color = e.data; document.getElementById('color').style.backgroundColor = color; }, false); </script> </body> </html>

?

  3.這時我們就可以看到效果了,如下圖,當我們點擊包含在main.html 中的 child.html頁面時,main.html中的FrameColor也跟著變了

?二、接下來我們實現(xiàn)跨域之間的localstorage共享?

  1.解決思路:在A域和B域下引入C域,所有的讀寫都由C域來完成,本地數據存在C域下;?因此 A哉和B域的頁面必定要引入C域的頁面; 當然C域最好是主域,原因后面會提到(在localstorage 不方便的情況下使用cookie);

  • 【A域】【B域】需要讀寫時,通過postMessage 向【C域】發(fā)送跨哉消息,
  • 【C域】監(jiān)聽跨域消息,在接到批定的消息時進行讀寫操作,
  • 【C域】接到跨域消息時,如果是寫入刪除可以不做什么,如果是讀取,就要先讀取本域本地數據通過postMessage向父頁面發(fā)送消息,
  • 【A 域 / B 域】在讀取【C域】數據時就需要監(jiān)聽來自【C域】的跨域消息

  

  2.注意事項:

  window.postMessage()方法,向【C域】發(fā)消息,應用iframe.contentWindow.postMessage() 這樣iframe內的【C 域】才可以接到,

  同理,【C域】向 【A 域B域】發(fā)消息時應用,window.parent.postMessage(),【A域、B域】的邏輯一定要在iframe 加載完成后進行。

?

  3.代碼:

   【C域】頁面如下:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="robots" content="noindex"><title>cross domain</title> </head> <body> <script>;(function(doc,win,undefined){var fn=function(){};fn.prototype={/*本地數據存儲*/setLocalCookie: function (k, v, t,domain) {typeof window.localStorage !== "undefined" ? localStorage.setItem(k, v) :(function () {t = t || 365 * 12 * 60 * 60;domain=domain?domain:".hc360.com";document.cookie = k + "=" + v + ";max-age=" + t+";domain="+domain+";path=/";})()},getLocalCookie: function (k) {k = k || "localDataTemp";return typeof window.localStorage !== "undefined" ? localStorage.getItem(k) :(function () {var all = document.cookie.split(";");var cookieData = {};for (var i = 0, l = all.length; i < l; i++) {var p = all[i].indexOf("=");var dataName = all[i].substring(0, p).replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");cookieData[dataName] = all[i].substring(p + 1);}return cookieData[k]})();},clearLocalData: function (k) {k = k || "localDataTemp";typeof window.localStorage !== "undefined" ? localStorage.removeItem(k) :(function () {document.cookie = k + "=temp" + ";max-age=0";})()},init:function(){this.bindEvent();},bindEvent:function(){var _this=this;win.addEventListener("message",function(evt){if(win.parent!=evt.source){return}var options=JSON.parse(evt.data);if(options.type=="GET"){var data=tools.getLocalCookie(options.key);win.parent.postMessage(data, "*");}options.type=="SET"&&_this.setLocalCookie(options.key,options.value);options.type=="REM"&&_this.clearLocalData(options.key);},false)}};var tools=new fn();tools.init();})(document,window); </script> </body> </html>

  【A域】頁面如下:我們再C中設置了?localStorage

<!DOCTYPE html> <html> <head> <title></title> </head> <body> <div style="width:200px; float:left; margin-right:200px;border:solid 1px #333;"> <div id="color">Frame Color</div> </div> <div> <iframe id="child" src="http:///c.html"></iframe> </div> <script type="text/javascript"> window.onload = function() {console.log('set key value......................')window.frames[0].postMessage(JSON.stringify({type:"SET",key:"key",value:"value"}),'*');} </script> </body> </html>

上傳A、C之后我們見到效果如上圖

?

    【B域】頁面如下:我們讀取A中設置的 localStorage

<!DOCTYPE html> <html> <head> <title></title> </head> <body> <div style="width:200px; float:left; margin-right:200px;border:solid 1px #333;"> <div id="color">Frame Color</div> </div> <div> <iframe id="child" src="http:///c.html"></iframe> </div> <script type="text/javascript"> window.onload = function() {console.log('get key value......................')window.frames[0].postMessage(JSON.stringify({type:"GET",key:"key"}),'*');}window.addEventListener('message', function(e) {console.log('listen.....');var data = e.data; console.log(data);}, false);</script> </body> </html>

訪問c打開console見到效果如下?

至此我們實現(xiàn)了跨域?localStorage 的讀取和刪除。

?

當然土豪隨意打賞

使用微信掃一掃,隨意

?

使用支付寶掃一掃,隨意

轉載于:https://www.cnblogs.com/tyrion1990/p/8134384.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的浅谈postMessage跨域通信与localStorage实现跨域共享的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.777含羞草| 俄罗斯毛片| 久热网| 久久国产秒 | 中文字幕免费视频观看 | 欧美黄色免费网站 | 极品色影视 | 深夜在线视频 | 爱情岛亚洲论坛入口福利 | 青青久久国产 | 亚洲精品成人无码毛片 | 欧美精品成人一区二区三区四区 | 少妇被爽到高潮动态图 | 韩国欧美三级 | 亚洲av无码乱码在线观看性色 | 狠狠躁夜夜躁人人爽天天高潮 | 麻豆精品视频 | 日操操| 亚洲av日韩精品久久久久久久 | 99re超碰| 久久久久夜 | 色欲久久久天天天综合网 | 日韩黄色影院 | 一区二区不卡在线 | 久草色在线 | 国产情侣自拍小视频 | 麻豆国产精品777777在线 | 无码播放一区二区三区 | 可以看的av网址 | 制服中文字幕 | 亚洲欧美日韩中文字幕在线观看 | 19韩国主播青草vip | 日本黄色三级 | 国产精品免费av一区二区 | 亚洲同性gay激情无套 | 精品国产乱码一区二区三区99 | 波多野结衣a v在线 欧洲免费av | 久久久久综合 | 中文字幕成人在线观看 | 91免费看大片 | 日韩美女国产精品 | 欧美一二级 | 久久综合久久网 | 国产欧美日韩精品区一区二污污污 | 男插女视频免费 | 亚洲中文字幕无码一区二区三区 | 国产精品传媒一区二区 | 久久免费视频观看 | 亚洲精品在线视频 | 在线免费av网址 | 免费网站在线观看人数在哪动漫 | 欧美粉嫩videosex极品 | 999福利视频 | 性色福利 | 亚洲色图图片 | 美女扒开腿让男人 | 美女爱爱视频 | 最近2018年手机中文字幕版 | 精品久久久99 | 99久| 国产精品毛片久久久 | 欧美极品少妇xxxxⅹ免费视频 | 国产成人在线影院 | 一久久久 | 日韩特黄一级片 | 国产伦精品一区二区三区千人斩 | 日本少妇激情舌吻 | 成人欧美一区二区三区 | 日本国产中文字幕 | 久久综合狠狠综合久久综合88 | 69视频国产 | av影片在线 | 欧美最猛性xxxx | 国产盗摄av | 亚洲一区二区高清视频 | 国产xxx在线观看 | 最近中文字幕mv免费高清在线 | 亚洲24p | 福利色导航 | 婷婷狠狠操 | 中文毛片无遮挡高潮免费 | 亚洲熟妇色自偷自拍另类 | 国产成年视频 | 97潮色 | 在线亚洲精品 | 国产无遮挡又黄又爽在线观看 | 春色激情| 国产看黄网站 | 久久国产毛片 | 国产人妻人伦精品1国产 | 奇米影视大全 | 精品国产精品网麻豆系列 | 日本熟妇乱子伦xxxx | 四虎成人精品在永久免费 | 人妻丰满熟妇av无码久久洗澡 | 日韩天堂在线 | 男人的天堂黄色 | www九九热 | 免费草逼视频 |