以下哪些是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 后,挂载使iframe全屏显示在a页窗口的方法。

  //Page A window . toggle full screen=()={//do something }在B页,可以直接获取A页的window对象,直接调用。

  //b page window . parent . toggle full screen()但是该值的设置有一定的限制,只能设置为当前文档的上一级域或者与该文档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的方法。

  !DOCTYPE html html lang= en head meta charset= UTF-8 title/title/head body脚本window . onload=function(){ parent . parent . toggle full screen();} /script/body/html由于C页和A页符合同源策略,所以可以避免跨域问题,执行全屏方式。

  postmessage

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

  //b页parent.postmessage(值, http://a . demo . com );//a page window . addevent listener( message ,function(event){ if(event . origin!==http://b.demo.com )返回;toggle full screen()});为了安全起见,在接收到信息后,检查event.origin的窗口以确定是否接收该信息。

  总结

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

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

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

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