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

vue中iframe使用以及結合postMessage實現跨域通信

 更新時間:2022年09月08日 11:53:48   作者:艾歡歡  
這篇文章主要介紹了vue中iframe使用以及結合postMessage實現跨域通信方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

使用場景

需求

在一個H5項目的頁面中以url的方式嵌入另一個項目的頁面。(不得不使用iframe)

而為了兼容移動端api(封裝的一個移動端api,iframe內嵌頁面不生效),需要實現父子頁面的通信 (使用postMessage)。

iframe使用

基本使用

直接在頁面嵌套iframe標簽指定src即可使用iframe。

<iframe src="xxx.html"></iframe>

常用屬性

  • frameborder:是否顯示邊框,1(yes),0(no)
  • height:框架作為一個普通元素的高度。
  • width:框架作為一個普通元素的寬度。
  • name:框架的名稱,window.frames[name]時專用的屬性。
  • scrolling:框架的是否滾動。yes,no,auto。
  • src:內框架的地址,可以使頁面地址,也可以是圖片的地址。
  • sandbox:對iframe進行一些列限制,IE10+支持

更多屬性訪問: 這里

iframe高度自適應

let ifr = document.getElementById('ifr')
const deviceHeight = document.documentElement.clientHeight;
ifr.style.height = (Number(deviceHeight)) + 'px';?

vue中需要在mounted()中進行高度初始化

獲取iframe的內容

通過兩個主要的API:contentWindow 和 contentDocument

  • iframe.contentWindow,獲取iframe的window對象
  • iframe.contentDocument,獲取iframe的document對象
var iframe = document.getElementById("iframe1");
var iwindow = iframe.contentWindow;
var idoc = iwindow.document;
console.log("window",iwindow);?? ?//獲取iframe的window對象
console.log("document",idoc);?? ?//獲取iframe的document
console.log("html",idoc.documentElement);?? ?//獲取iframe的html
console.log("head",idoc.head);?? ?//獲取head
console.log("body",idoc.body);?? ?//獲取body

通過Name屬性,通過window提供的frames獲取

<iframe src ="xxx.html" id="ifr1" name="ifr1" scrolling="yes">
? ? <p>Your browser does not support iframes.</p>
</iframe>
<script type="text/javascript">
? ? console.log(window.frames['ifr1'].window);
? ? console.dir(document.getElementById("ifr1").contentWindow);
</script>

window.frames['ifr1'] 返回的就是window對象,即 window.frames['ifr1']===window

同域下獲取父級/子級內容

  • window.parent:獲取上一級的window對象,如果還是iframe則是該iframe的window對象
  • window.top:獲取最頂級容器的window對象

iframe跨域

以下形式的跨域,可以使用iframe進行解決。某一方使用iframe嵌套在另一方。

比如:http://www.foo.com/a.html 和 http://script.foo.com/b.html

兩個文件中分別加上 document.domain = 'foo.com',指定相同的主域,然后,兩個文檔就可以進行交互。

//b.html是以iframe的形式嵌套在a.html中
//www.foo.com上的a.html
document.domain = 'foo.com';
var ifr = document.createElement('iframe');
ifr.src = 'http://script.foo.com/b.html';
ifr.style.display = 'none';
document.body.appendChild(ifr);
ifr.onload = function(){
? ? var doc = ifr.contentDocument || ifr.contentWindow.document;
? ? // 在這里操縱b.html
? ? alert(doc.getElementsByTagName("h1")[0].childNodes[0].nodeValue);
};
//script.foo.com上的b.html
document.domain = 'foo.com';

默認情況下 document.domain 是指 window.location.hostname 。可以手動更改,但是最多只能設置為主域名。 通常,主域名就是指不帶www的hostname, 比如: foo.com , baidu.com 。

如果,帶上www或者其他的前綴,就是二級域名或者多級域名。通過上述設置,相同的domain之后,就可以進行同域的相關操作。

如果設置的iframe的域名和 top.window 的域名完全不同。則可以使用postMessage()進行通信

postMessage通信

window.postMessage() 方法可以安全地實現跨源通信。通常,對于兩個不同頁面的腳本,只有當執(zhí)行它們的頁面位于具有相同的協議(通常為https),端口號(443為https的默認值),以及主機 (兩個頁面的模數 Document.domain設置為相同的值) 時,這兩個腳本才能相互通信。window.postMessage() 方法提供了一種受控機制來規(guī)避此限制,只要正確的使用,這種方法就很安全。

具體使用方式參考:window.postMessage

<iframe src="http://xxx.com" name="sendMessage"></iframe>

父頁面向子頁面?zhèn)鬟f信息:

// 父頁面js
let ifr = window.frames['sendMessage'];
// 向子頁面發(fā)送message
ifr.postmessage('give u a message', "http://xxx.com");
// xxx.com頁面js
// 監(jiān)聽父頁面?zhèn)鱽淼男畔?
window.addEventListener('message', receiver, false);
function receiver(e) {
? ? if (e.origin == 'http://xxx.com') {
? ? ? ? if (e.data == 'give u a message') {
? ? ? ? ? ? e.source.postMessage('received', e.origin); ?// 向原網頁返回信息
? ? ? ? } else {
? ? ? ? ? ? alert(e.data);
? ? ? ? }
? ? }
}

在vue中使用

<iframe :src="src" ref="iframe" frameborder="0"></iframe>

1.要將獲取到iframe的contentWindow屬性放到mounted這個鉤子函數中。

mounted() {
? ? this.iframeWin = this.$refs.iframe.contentWindow;
}

2.子頁面向父頁面?zhèn)髦?/p>

父頁面代碼:

// 父頁面監(jiān)聽子頁面?zhèn)鱽淼男畔?
mounted() {
? ? window.addEventListener('message', this.handleMessage);
? ? this.iframeWin = this.$refs.iframe.contentWindow;
},
methods: {
? ? handleMessage (event) {
? ? ? ? const data = event.data.data
? ? ? ? if(data.info === "success"){
? ? ? ? ? ? alert(data.data)
? ? ? ? }
? ? }
}

子頁面代碼:

sendMessage() {
? ? // 向父頁面發(fā)送信息
? ? window.parent.postMessage({
? ? ? ? data: {
? ? ? ? ? ? info:"success",
? ? ? ? ? ? data:"我是子頁面的test!"
? ? ? ? }
? ? }, '*');
}

3.父頁面向子頁面?zhèn)鬟f信息同理

sendMessage () {
? ? // 向子頁面?zhèn)鲾祿?需要注意這里沒有parent
? ? this.iframeWin.postMessage({
? ? ? ? info: 'success',
? ? ? ? data: "我是來自父頁面的data!"
? ? }, '*')
}

注意父向子傳遞信息的時候,要等子頁面加載完成后,再進行通信

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • vue接入ts基本方法

    vue接入ts基本方法

    這篇文章主要介紹了vue接入ts基本方法,關于ts,也出了很久,下面我們就來簡單學習了下ts并且在原有項目上接入基本ts語法,也算是一個初級嘗試,簡單梳理下基礎的接入配置和已經遇到的問題,供需要的小伙伴們參考
    2022-01-01
  • 基于vue-cli 路由 實現類似tab切換效果(vue 2.0)

    基于vue-cli 路由 實現類似tab切換效果(vue 2.0)

    這篇文章主要介紹了基于vue-cli 路由 實現類似tab切換效果(vue 2.0),非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • 如何搭建一個完整的Vue3.0+ts的項目步驟

    如何搭建一個完整的Vue3.0+ts的項目步驟

    這篇文章主要介紹了如何搭建一個完整的Vue3.0+ts的項目步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • vue實現zip文件下載

    vue實現zip文件下載

    這篇文章主要為大家詳細介紹了vue實現zip文件下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 在Vant的基礎上實現添加表單驗證框架的方法示例

    在Vant的基礎上實現添加表單驗證框架的方法示例

    這篇文章主要介紹了在Vant的基礎上實現添加驗證框架的方法示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Vue項目打包部署全過程(history模式)

    Vue項目打包部署全過程(history模式)

    vue項目中我們比較常用的模式為hash和history模式,下面這篇文章主要給大家介紹了關于Vue項目打包部署的全過程,講解的是vue-router中history模式的部署,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • vue實現前臺列表數據過濾搜索、分頁效果

    vue實現前臺列表數據過濾搜索、分頁效果

    這篇文章主要為大家詳細介紹了vue實現前臺列表數據過濾搜索、分頁效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • vue3??mixin?混入使用方法

    vue3??mixin?混入使用方法

    這篇文章主要介紹了?vue3??mixin?混入使用方法,mixin?混入,提供了一種非常靈活的方式,來分發(fā)?vue?組件中的可復用功能,一個mixin?對象可以包含任意組件選項,當組件使用?mixin?對象時,所有的?mixin?對象的選項將被混入組件本身的選項。,需要的朋友可以參考一下
    2021-11-11
  • Vue插值、表達式、分隔符、指令知識小結

    Vue插值、表達式、分隔符、指令知識小結

    這篇文章主要介紹了Vue插值、表達式、分隔符、指令的相關知識,文中給大家提到了去除vue插值表達式{{}}的方法,需要的朋友可以參考下
    2018-10-10
  • vue+iview寫個彈框的示例代碼

    vue+iview寫個彈框的示例代碼

    本篇文章主要介紹了vue+iview寫個彈框的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12

最新評論

密山市| 宾阳县| 汉源县| 历史| 苏尼特左旗| 宜阳县| 连平县| 封丘县| 寻乌县| 鄂尔多斯市| 武陟县| 垣曲县| 祁连县| 华亭县| 静宁县| 天门市| 深州市| 个旧市| 深圳市| 陈巴尔虎旗| 罗江县| 阿拉善右旗| 甘谷县| 仙桃市| 镇坪县| 永修县| 瑞丽市| 黄骅市| 东乡县| 唐海县| 宜春市| 得荣县| 阳城县| 海安县| 湘阴县| 双柏县| 彩票| 龙海市| 韶关市| 个旧市| 景泰县|