麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > HTML5 > 正文

iframe跨域的幾種常用方法

2024-09-05 07:23:07
字體:
供稿:網(wǎng)友

背景

隨著業(yè)務(wù)的發(fā)展,自然地會(huì)有一些公共的業(yè)務(wù)被抽離成為公共組件共各個(gè)項(xiàng)目使用。但是由于各個(gè)項(xiàng)目用到的技術(shù)棧都有所不同,所以這個(gè)公共組件就不能方便地被引用了。為解決這個(gè)問題,我們把這個(gè)組件寫成了單獨(dú)的頁面掛到一個(gè)域名下,其他項(xiàng)目采用iframe或者webview的方式去加載這個(gè)頁面,從而實(shí)現(xiàn)功能的簡單復(fù)用。

不過這過程中也產(chǎn)生了很多問題,單是跨域就會(huì)出現(xiàn)好幾次了。以下我將會(huì)介紹我遇到的跨域問題以及一些解決方法。

為什么會(huì)跨域

為了保證用戶信息的安全,95年的時(shí)候Netscape公司引進(jìn)了同源策略,里面的同源指的是三個(gè)相同:協(xié)議、域名、端口。

違反了同源策略就會(huì)出現(xiàn)跨域問題,主要表現(xiàn)為以下三方面:

  • 無法讀取cookie、localStorage、indexDB
  • DOM無法獲得
  • ajax請求無法發(fā)送

場景

最近在做一個(gè)需求,需要用iframe引入一個(gè)別人封裝好的類似視頻播放器的東西。iframe里面有一個(gè)全屏的按鈕,點(diǎn)擊后需要頁面讓iframe全屏,由于受到同源策略的限制,iframe無法告訴頁面全屏。

解決辦法

設(shè)置domain

document.domain作用是獲取/設(shè)置當(dāng)前文檔的原始域部分,同源策略會(huì)判斷兩個(gè)文檔的原始域是否相同來判斷是否跨域。這意味著只要把這個(gè)值設(shè)置成一樣就可以解決跨域問題了。
在此我將domain設(shè)置為一級(jí)域名的值,a頁面url為a.demo.com,a頁面中iframe引用的b頁面url為b.demo.com,具體設(shè)置為

document.domain = 'demo.com'

設(shè)置完之后,在a頁面的window上掛載使iframe全屏的方法

// a頁面window.toggleFullScreen = () => {    // do something}

在b頁面上可以直接獲取到a頁面的window對象并直接調(diào)用

// b頁面window.parent.toggleFullScreen()

但是這個(gè)值的設(shè)置也有一定限制,只能設(shè)置為當(dāng)前文檔的上一級(jí)域或者是跟該文檔的URL的domain一致的值。如url為a.demo.com,那domain就只能設(shè)置為demo.com或者a.demo.com。因此,設(shè)置domain的方法只能用于解決主域相同而子域不同的情況。

使用中間頁面

我們還可以使用一個(gè)與a頁面同域名但不同路由的c頁面作為中間頁面,b頁面加載c頁面,c頁面調(diào)用a頁面的方法,從而實(shí)現(xiàn)b頁面調(diào)用a頁面的方法。具體操作如下:

在a頁面的node層新開一個(gè)路由,此路由加載一個(gè)c頁面作為中間頁面,c頁面的url為a.demo.com/c。c頁面只是一個(gè)簡單的html頁面,在window的onload事件上調(diào)用了a頁面的方法。

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

由于c頁面和a頁面是符合同源策略的,所以可以避開跨域問題,執(zhí)行全屏的方法。

postmessage

window.postMessage方法可以安全地實(shí)現(xiàn)跨源通信,寫明目標(biāo)窗口的協(xié)議、主機(jī)地址或端口就可以發(fā)信息給它。

// b頁面parent.postMessage(    value,    "http://a.demo.com");
// a頁面window.addEventListener("message", function( event ) {    if (event.origin !== 'http://b.demo.com') return;    toggleFullScreen() });

為了安全,收到信息后要檢測下event.origin判斷是否要收信息的窗口發(fā)過來的。

總結(jié)

通過以上的方法,我們就可以和iframe自由通信啦。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久99亚洲精品久久99果 | 女人解衣喂奶电影 | 欧美三级欧美成人高清www | 九九热播视频 | 黑人三级毛片 | 成人在线观看小视频 | 在线免费黄色网 | 免费看a级片| 久久久久久亚洲综合影院红桃 | 日本成人二区 | 国产老师做www爽爽爽视频 | 国产精品成人一区二区三区电影毛片 | 国产美女爽到喷白浆的 | 亚洲极色 | 国产亚洲欧美日韩在线观看不卡 | 成年人视频在线免费观看 | 少妇一级淫片免费放播放 | 国产女同疯狂激烈互摸 | 免费黄色欧美视频 | 欧美性受xxxx人人本视频 | 羞羞的视频免费在线观看 | 日韩欧美精品电影 | 国产91丝袜在线播放 | fc2国产成人免费视频 | 欧美国产免费 | 午夜视频在线免费播放 | 羞羞视频免费观看网站 | 中文日韩 | 毛片免费试看 | 国产精品视频成人 | 精品xxxx户外露出视频 | 久久国产精品久久久久久久久久 | 污片视频在线观看 | 成人午夜精品久久久久久久蜜臀 | 精品国产91久久久 | 美国av免费看 | 欧洲成人综合网 | 欧美日韩中文字幕在线 | 国产福利不卡一区二区三区 | 亚洲爱爱网站 | 国产在线免费 |