最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iframe跨域的幾種常用方法

  發(fā)布時(shí)間:2019-11-11 16:19:54   作者:蘇格團(tuán)隊(duì)   我要評(píng)論
這篇文章主要介紹了iframe跨域的幾種常用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

背景

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

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

為什么會(huì)跨域

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

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

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

場(chǎng)景

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

解決辦法

設(shè)置domain

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

document.domain = 'demo.com'

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

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

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

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

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

使用中間頁(yè)面

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

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

<!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頁(yè)面和a頁(yè)面是符合同源策略的,所以可以避開(kāi)跨域問(wèn)題,執(zhí)行全屏的方法。

postmessage

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

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

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

總結(jié)

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解使用postMessage解決iframe跨域通信問(wèn)題

    這篇文章主要介紹了詳解使用postMessage解決iframe跨域通信問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小
    2019-11-01
  • 跨域修改iframe頁(yè)面內(nèi)容詳解

    這篇文章主要介紹了跨域修改iframe頁(yè)面內(nèi)容詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)
    2019-10-31
  • 關(guān)于iframe跨域使用postMessage的實(shí)現(xiàn)

    這篇文章主要介紹了關(guān)于iframe跨域使用postMessage的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一
    2019-10-29
  • HTML5 window/iframe跨域傳遞消息 API介紹

    window.postMessage允許多個(gè) window/frame之間跨域傳遞數(shù)據(jù)和信息。下面為大家介紹下window.postMessage的工作原理,以及如何在FireFox,IE8+,Opera,Safari和Chrome中使用
    2013-08-26
  • Iframe 高度自適應(yīng)(兼容IE/Firefox、同域/跨域)

    在實(shí)際的項(xiàng)目進(jìn)行中,很多地方可能由于歷史原因不得不去使用iframe,包括目前正火熱的應(yīng)用開(kāi)發(fā)也是如此。
    2010-03-17

最新評(píng)論

宝应县| 黄骅市| 荥阳市| 社会| 西乡县| 迭部县| 广昌县| 宁海县| 天门市| 天气| 临沧市| 钟祥市| 商河县| 阿克苏市| 兴城市| 金寨县| 元氏县| 怀柔区| 房产| 湘阴县| 屏南县| 苏尼特右旗| 印江| 黄石市| 左云县| 南阳市| 伊金霍洛旗| 兴城市| 肇州县| 保康县| 晋中市| 松江区| 武胜县| 曲麻莱县| 张掖市| 七台河市| 偏关县| 昌图县| 伊金霍洛旗| 双流县| 景洪市|