以下哪些是iframe跨域的方法,前端iframe跨域,详解iframe跨域的几种常用方法(小结)

以下哪些是iframe跨域的方法,前端iframe跨域,详解iframe跨域的几种常用方法(小结)

本文主要介绍几种常用的方法(总结)来解释iframe跨域。边肖认为这很好。现在分享给大家,给大家一个参考。来和边肖一起看看吧。

背景

随着业务的发展,自然会抽离一些公共业务,成为公共组件供各种项目使用。但是因为每个项目使用的技术栈不一样,所以这个通用的组件是不能轻易引用的。为了解决这个问题,我们把这个组件写成一个单独的页面挂在一个域名下,其他项目用iframe或者webview加载这个页面,从而实现功能的简单复用。

但是这个过程中会出现很多问题,光是跨域就会出现好几次。下面我就介绍一下我遇到的跨域问题和一些解决方法。

为什么会跨域

为了保证用户的信息安全,1995年网景推出了同源策略,其中同源是指协议、域名、端口三个相似。

违反同源策略会导致跨域问题,主要表现在以下三个方面:

无法读取cookie,localStorage,indexDB

DOM无法获取

无法发送Ajax请求。

场景

最近在做一个需求,需要用iframe推出一个类似别人打包的视频播放器的东西。iframe中有一个全屏按钮,要求页面在点击后使iframe全屏。由于同源策略的限制,iframe无法告诉页面全屏。

解决办法

设置domain

document.domain的作用是获取/设置当前文档的原域部分,同源策略会判断两个文档的原域是否相同来判断是否跨域。这意味着只要将这个值设置为相同的值,就可以解决跨域问题。

在这里,我将域设置为一级域名的值。页面A的url是a.demo.com,页面A中的iframe引用的页面B的url是b.demo.com。具体设置是

document.domain='demo.com '

设置后,在页面a的窗口上安装使iframe全屏的方法。

//一页

window.toggleFullScreen=()={

//做点什么

}

在b页,可以直接获取a页的window对象,直接调用。

//b页

window.parent.toggleFullScreen()

但该值的设置有一定的限制,只能设置为当前文档的上一级域或与该文档URL的域一致的值。如果url是a.demo.com,那么域只能设置为demo.com或a.demo.com。因此,设置域的方法只能用于解决主域相同但子域不同的情况。

使用中间页面

我们也可以用一个与A页域名相同但路由不同的C页作为中间页,B页加载C页,C页调用A页的方法,从而实现B页调用A页的方法,具体操作如下:

在页面a的节点层新建一个路由,这个路由加载一个页面C作为中间页面,页面C的url是a.demo.com/c.页面C只是一个简单的html页面,在window的onload事件中调用页面a的方法。

!文档类型html

html lang='en '

meta charset='UTF-8 '

标题/标题

/头

身体

脚本

window.onload=function () {

parent . parent . toggle full screen();

}

/脚本

/body

/html

因为C页和A页符合同源策略,所以可以避免跨域问题,实现全屏方式。

postmessage

window.postMessage方法可以安全地实现跨源通信,你可以通过声明目标窗口的协议、主机地址或端口,向目标窗口发送信息。

//b页

parent.postMessage(

值,

' http://a.demo.com '

);

//一页

window . addevent listener(' message ',function( event ) {

if (event.origin!=='http://b.demo.com ')返回;

toggle全屏()

});

为了安全起见,在接收到信息后,检查event.origin的窗口以确定是否接收该信息。

总结

通过以上方法,我们可以与iframe自由通信。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: