面向未来的浏览器页面跨域解决方案代码实例, 跨域杂谈现代浏览器对于跨域限制是越来越多了,iframe中无法使用cooike等等问题,网上找了目前的写法,记录下来。 第一种的兼容性大于第二种。 window.postMessage窗口1 端口:5050<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h2>主页面</h2> <iframe id="contentIframe" src="http://localhost:5051/demo/b.html"></iframe> </body> <script type="text/javascript"> window.onload = function() { console.log('window页面发送消息') console.log(document.getElementById('contentIframe')) document.getElementById('contentIframe').contentWindow.postMessage( { code: 1, msg: 'Hello b, i am window.html' }, "http://localhost:5051" ); }; window.addEventListener('message', function(event){ // 通过origin属性判断消息来源地址 if (event.origin === 'http://localhost:5051') { console.log('window页面收到消息:' + event.data.msg) } }, false); </script> </html> 窗口2 端口:5051<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <span>我是b页面</span><br> <input type="button" value="回消息" onclick="postmsg()"> </body> <script type="text/javascript"> let parent = null; let origin = null; window.addEventListener('message', function(event){ // 通过origin属性判断消息来源地址 if (event.origin === 'http://localhost:5050') { parent = event.source origin = event.origin console.log('b页面收到消息:' + event.data.msg) } }, false); /** * 回消息方法 * * 假设你已经验证了所受到信息的origin (任何时候你都应该这样做), * 一个很方便的方式就是把event.source作为回信的对象, * 并且把event.origin作为targetOrigin */ function postmsg() { console.log('b页面回消息') parent.postMessage({ code: 1, msg: 'hi, i am b.html' }, origin) } </script> </html> 详情文档 postMessage Channel Messaging API主页面<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width" /> <title>Channel messaging demo</title> </head> <body> <h1>Channel 代码</h1> 来自子页面的消息: <p class="output">Index页面</p> <iframe src="page2.html" width="480" height="320"></iframe> <script> const channel = new MessageChannel(); const output = document.querySelector('.output'); const iframe = document.querySelector('iframe'); // Wait for the iframe to load iframe.addEventListener("load", onLoad); function onLoad() { // Listen for messages on port1 channel.port1.onmessage = onMessage; // Transfer port2 to the iframe iframe.contentWindow.postMessage("Hello from the main page!", "*", [ channel.port2, ]); } // Handle messages received on port1 function onMessage(e) { output.innerHTML = e.data; } </script> </body> </html> 子界面<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width" /> <title>My page title</title> </head> <body> <h3>Iframe页面</h3> 来自主页面的消息:<p class="output">iFrame 页面</p> <script> const output = document.querySelector(".output"); window.addEventListener("message", onMessage); function onMessage(e) { output.innerHTML = e.data; // Use the transfered port to post a message back to the main frame e.ports[0].postMessage("Message back from the IFrame"); } </script> </body> </html> 详情文档 ChannelMessaging 封 Other #跨域 面向未来的浏览器页面跨域解决方案代码实例, https://wangijun.com/2023/11/13/other-15/ 作者 无良芳 发布于 2023年11月13日 许可协议 Maven多模块项目单独打包某一个项目。 上一篇 从0到一个前端后台管理框架(五) 下一篇