首页 > 其他分享 >#yyds干货盘点#iframe跨域的几种常用方法

#yyds干货盘点#iframe跨域的几种常用方法

时间:2023-03-15 21:32:13浏览次数:41  
标签:postMessage yyds domain 跨域 window html iframe 页面

在开发日常中,会遇到使用iframe嵌套其他页面,想要与嵌套页面进行交互,常常会涉及到跨域问题,何为跨域?这涉及到同源策略,即协议、端口、域名相同则为同源

违反了同源策略就会出现跨域问题,主要表现为以下三方面:
1.无法读取cookie、localStorage、indexDB
2.DOM无法获得
3.ajax请求无法发送


解决方法


一、设置domain

前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域

具体实现

//a.html
<iframe src="http://b.demo.com:8080/b.html" "load()" id="frame"></iframe>
<script type="text/javascript">
document.domain = 'demo.com';
function load(){
console.log(frame.contentWindow.name);
}
</script>

//b.html
<script type="text/javascript">
document.domain = 'demo.com';
var name = 'demo';
</script>

现象:加载a.html,会打印"demo"

原因分析:当主域之间相互通信的时候,只要将两者的document.domain赋值为当前的主域地址,即可实现跨域通信。

二、使用中间页面

还可以使用一个与a页面同域名但不同路由的c页面作为中间页面,b页面加载c页面,c页面调用a页面的方法,从而实现b页面调用a页面的方法。具体操作如下:
在a页面的node层新开一个路由,此路由加载一个c页面作为中间页面,​c页面的url为a.demo.com/c。c页面只是一个简单的html页面,在window的onload事件上调用了a页面的方法。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script>
window.onload = function () {
console.log()
}
</script>
</body>
</html>

三、postmessage

window.postMessage() 方法允许来自一个文档的脚本可以传递文本消息到另一个文档里的脚本,而不用管是否跨域。一个文档里的脚本还是不能调用在其他文档里方法和读取属性,但他们可以用这种消息传递技术来实现安全的通信。

a.html:

<body>
<button onclick="postTestMessage()">postMessage</button>
<iframe src="./b.html" frameborder="0" id="iframe"></iframe>
</body>
<script>
let receiveMessage = function(event) {
console.log('a: ', event);
let datas = JSON.parse(event.data);
if (datas.type === "advert") {
let postIframeData = {
type:'adGivePrize',
givePrize:true
};
//iframe发送信息~~~~
window.frames[0].postMessage(JSON.stringify(postIframeData), '*');
// window.frames[0].postMessage('a页面', '*');
}
}

window.addEventListener("message", receiveMessage, false);

function postTestMessage() {
let defaultAdData = {
type:'advert',
gameData:{
adId: '123'
}
};
window.postMessage(JSON.stringify(defaultAdData), '*');
}
</script>

b.html

<body>
<h1>我是b页面</h1>
</body>
<script>
var receiveMessage = function(event) {
console.log('b: ', JSON.parse(event.data));
}
window.addEventListener("message", receiveMessage, false);
</script>

在实际使用此方法的过程中遇到了b.html的DOM未加载完就触发了window.addEventListener(),在b.html接收不到数据,因此在a.html中加了定时器

// 定时访问发送信息,在iframe页面在没加载完页面触发了addEventListener方法,获取不到数据
let count = 0;
that.timer = setInterval(() => {
postTestMessage();
count++;
if (count > 10) {
clearInterval(that.timer);
}
}, 500);



标签:postMessage,yyds,domain,跨域,window,html,iframe,页面
From: https://blog.51cto.com/u_11365839/6123578

相关文章

  • gin跨域(CROS)时GET和POST正常但PUT和DELETE被阻止
    问题表现同一个项目请求同一个服务时,Get和Post请求正常,但是Put和Delete一直报跨域错误的问题AccesstoXMLHttpRequestat'http://127.0.0.1:8011/api/organization'fr......
  • diango_vue cors跨域问题
    pip3install django-cors-headers注意版本,django和django-cors-headers存在版本兼容问题,安装过高版本的django-cors-headers会导致自动升级django版本,带来一些......
  • Node.js 中使用 Playwright 定位到一个 iframe
      要在Node.js中使用Playwright定位到一个iframe并获取其在屏幕中的位置,可以按照以下步骤进行:1.使用`page.frame()`方法获取iframe元素的句柄:```javas......
  • axios和跨域解决
    axios写法axios.get("xxx地址").then( (response)=>{ console.log(); }, (error)=>{ console.log......
  • # yyds干货盘点 # 已知中心点的经纬度和长宽,怎么求矩形左上角和右下角经纬度呀?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【缄默】问了一个经纬度处理的问题,这里拿出来给大家分享下。二、实现过程这个问题确实挺难的,像是数学题目,这里【吴超......
  • #yyds干货盘点#简单的vuex实现
    实现一个vuex插件​​pvuex​​ 初始化:Store声明、install实现,vuex.js:letVue;//定义install方法完成赋值与注册functioninstall(_Vue){Vue=_Vue;Vue.mixin({......
  • #yyds干货盘点#Vuex中的store
    每一个​​Vuex​​应用的核心就是store(仓库)。store基本上就是一个容器,包含着应用中大部分的state(状态)。​​Vuex​​和单纯的全局对象有以下两点不同:​​Vuex​​ 的状态......
  • vue模板跨域问题
        在接口中有baseURL就不会拼axios中默认的baseURL ......
  • AngularJS实现跨域请求
    跨域,前端开发中经常遇到的问题,AngularJS实现跨域方式类似于Ajax,使用CORS机制。下面阐述一下AngularJS中使用$http实现跨域请求数据。AngularJSXMLHttpRequest:$http用于读......
  • AngularJS实现cookie跨域
    前后端分离被越来越多的公司重视利用,然后带来的最棘手的问题就是,用户信息应如何保存。一、场景描述以Java为后台,AngluarJS做前端为例进行描述:当用户在界面登录时,需把用户......