婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > html5使用window.postMessage進行跨域實現數據交互的一次實戰

html5使用window.postMessage進行跨域實現數據交互的一次實戰

熱門標簽:智能語音電銷機器人客戶端 高德地圖標注廁所 江西ai電銷機器人如何 中國地圖標注城市的 地圖標注員工作內容 通遼地圖標注app 威海語音外呼系統平臺 西安金倫外呼系統 地圖標注沿海城市房價

背景

在一個App內嵌的H5中,產品希望在頁面的下放設置一個區域,里面展示運營同學通過活動搭建平臺生成的教學頁面,頁面由運營同學自己搭建、替換,產品同學希望H5中能完整展示這個教學頁面的內容。

從業務需求上描述,就是一個H5(A頁面)內需要通過iframe加載另一個H5頁面(B頁面)。但是從技術角度來看就有以下幾點需要注意的地方:

  • B頁面的高度不確定,B頁面由活動搭建平臺生成,至于展示的內容是什么、有多少并不知道。
  • A頁面和B頁面是不同源的,因此無法直接通過iframe的contentWindow獲取到B頁面的尺寸。

解決方法

其實接合1、2點,核心就是需要在A頁面獲取到B頁面的高度,然后調整A頁面展示區域的高度,實現在A頁面完整展示B頁面的功能。

初步想法

這里我想到了使用window.postMessage去解決不同域下頁面通訊的問題。A頁面不能主動通過不同域的contentWindow獲取到B頁面的尺寸,那么,讓B頁面通過window.postMessage通知頁面A就好了,自己獲取自己的總能獲取到。

但是問題來了,B頁面不是確定的,是由運營通過搭建平臺生成的,也就是說,是沒辦法在B頁面通過代碼入侵的方式通知A頁面。

進一步想法

實際上,搭建平臺中的組件是可實現的。可以通過開發一個“iframe通訊組件”,再基于這個組件搭建一個C頁面作為“橋”。那么,因為B頁面和C頁面都是由搭建平臺生成,是同域的,那么,C頁面可以主動地通過iframe的contentWindow獲取到B頁面的高度。最后,A頁面和C頁面雖然是跨域,但是通過window.postMessage可以實現跨域通訊,A頁面只需要監聽message事件即可。

有了這樣一個作為“橋”的C頁面,那么以后不管運營同學通過搭建平臺發布什么頁面,A頁面都是可以完整展示B頁面的內容,并且B頁面不需要做任何事情。

前置知識

postMessage

otherWindow.postMessage(message, targetOrigin, [transfer]);

首先,otherWindow是一個其他窗口的引用,什么情況下可以獲得其他窗口呢?可以通過iframe的contentWindow、window.opener(這個頁面從哪里打開的)以及window.parent(A頁面通過iframe嵌套C頁面時,C頁面可通過window.parent獲取A頁面的引用)。
message是一個對象,簡單來說,傳輸時會默認做深拷貝,所以不用擔心引用的問題。具體拷貝規則: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm (又發現了一個實現深拷貝的方式?)

targetOrigin通過這個參數來實現哪些窗口能收到這個消息,如果為'*',那么就是都可以。可以傳入一個URI字符串,會通過協議、主機地址、端口去比對,三者中有一者不匹配,就傳不過去。
更詳細的可以閱讀: https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage

實現

C 頁面

先來實現作為“橋”的C頁面,這個頁面是主要的實現。
首先,C頁面是被A頁面通過iframe加載的,因此,這里通過獲取URL上參數的方式,獲得B頁面的鏈接。

const src = getQueryString('src');

獲取到鏈接后,C頁面通過iframe的方式加載B頁面,并且添加到文檔中。為了能夠獲取到B頁面的鏈接,我們需要在B頁面onload事件觸發后再獲取,此時頁面上的圖片已經加載完畢。

const iframe = document.createElement('iframe');
iframe.addEventListener('load', () => {
    // 關鍵步驟
});
iframe.src = src;
iframe.style.visibility = 'hidden';
document.body.appendChild(iframe);

最后實現onload事件中的關鍵步驟:獲取B頁面的高度、通過 postMessage 發送高度參數給A頁面。
獲取B頁面的高度:

const doc = iframe.contentDocument;
const iframeHeight = Math.max(doc.body.clientHeight, doc.documentElement.clientHeight, doc.body.scrollHeight, doc.documentElement.scrollHeight);

通過 window.parent 獲取A頁面的 window 對象的引用,最后通過window.parent.postMessage向A頁面發送消息:

if (window.parent) {
  window.parent.postMessage(
    {
      type: 'resize-iframe',
      data: {
        height: iframeHeight
      }
    },
    '*'
  );
}

A 頁面

A頁面做的事情就比較簡單了,就是一個iframe加載B頁面,另一個iframe加載C頁面。通過message事件獲取最終高度,調整B頁面iframe的高度。

const resizeHandler = (e) => {
  const data = e.data;
  if (data.type === 'resize-iframe') {
    const { height } = data.data;
    // 這里設置了最小400高度
    this.height = Math.max(400, height);
  }
};
window.addEventListener('message', resizeHandler);

總結

通過window.postMessage的方式進行跨域其實也是第一次去實踐,以前總是在一些面試復習資料中了解到,但日常的跨域基本上都是用CORS的場景(其實CORS都不用前端做什么事情),甚至連JSONP都沒有。
業務中能用到不常用的方式解決問題,感覺也是挺好的,起碼知識不會停留在字面上~

到此這篇關于html5使用window.postMessage進行跨域實現數據交互的一次實戰的文章就介紹到這了,更多相關html5 window.postMessage跨域內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章,希望大家以后多多支持腳本之家! 

標簽:崇左 北海 營口 青海 晉中 阜陽 眉山 河池

巨人網絡通訊聲明:本文標題《html5使用window.postMessage進行跨域實現數據交互的一次實戰》,本文關鍵詞  html5,使用,window.postMessage,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《html5使用window.postMessage進行跨域實現數據交互的一次實戰》相關的同類信息!
  • 本頁收集關于html5使用window.postMessage進行跨域實現數據交互的一次實戰的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美人动与zoxxxx乱| 日韩三级伦理片妻子的秘密按摩| 国产盗摄视频一区二区三区| 日韩午夜精品视频| 亚洲男同1069视频| 暴力调教一区二区三区| xfplay精品久久| 国产综合色精品一区二区三区| 欧美日韩高清一区二区| 亚洲最大成人综合| 精品污污网站免费看| 三级成人在线视频| 欧美二区三区的天堂| 久久精品国产一区二区三| 欧美日韩aaaaa| 免费成人av资源网| 精品久久久久久久久久久久久久久久久 | 精品少妇一区二区三区日产乱码 | 粉嫩在线一区二区三区视频| 日韩欧美一区在线| 日本韩国一区二区| 亚洲蜜臀av乱码久久精品蜜桃| 国产日产欧美一区| 精品国产伦一区二区三区观看方式 | 国产精品一品二品| 国产美女一区二区三区| 99麻豆久久久国产精品免费优播| 色综合久久久久网| 欧美日韩一级片在线观看| 欧美浪妇xxxx高跟鞋交| 成人看片黄a免费看在线| 国产亚洲精品aa午夜观看| 激情都市一区二区| 日日噜噜夜夜狠狠视频欧美人 | 亚洲国产人成综合网站| 91成人看片片| 亚洲一区二区av在线| 亚洲欧洲日韩综合一区二区| 色综合久久中文字幕| 麻豆精品一区二区| 欧美国产国产综合| 免费观看一级欧美片| 久久99精品国产| 日韩精品一级中文字幕精品视频免费观看| 日韩美女啊v在线免费观看| 色综合中文综合网| 日韩电影在线一区二区| 2020国产精品久久精品美国| 成av人片一区二区| 国产一区二区三区免费| 欧美日韩专区在线| 中文字幕第一区二区| 国产91丝袜在线播放0| 不卡在线观看av| 日韩欧美中文字幕精品| 在线观看91av| 久久在线免费观看| 亚洲三级电影全部在线观看高清| 亚洲欧美福利一区二区| 亚洲精品免费看| 国产亚洲精品aa| 亚洲精品日日夜夜| 国产综合一区二区| 色噜噜狠狠一区二区三区果冻| 欧美日本国产一区| 一区二区三区视频在线看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产精品久久久久精k8| 国产在线视视频有精品| 麻豆免费看一区二区三区| 国产成人综合网| 色综合久久综合中文综合网| 日韩一卡二卡三卡四卡| 亚洲精品国产a| 成人夜色视频网站在线观看| 91视视频在线直接观看在线看网页在线看| 欧美日韩三级一区二区| 久久久精品黄色| 视频一区国产视频| 日韩午夜激情视频| 青青草国产成人99久久| 在线视频你懂得一区| 国产精品天干天干在线综合| 综合色中文字幕| 国产精品国产三级国产aⅴ原创| 久久久精品tv| 久久久精品人体av艺术| 久久99久久久欧美国产| 日本高清不卡在线观看| 中文字幕av不卡| 成人午夜电影网站| 亚洲三级免费电影| 成人一区二区三区视频在线观看| 国产人成亚洲第一网站在线播放| 国产精品亚洲一区二区三区在线| 日本一区二区三区在线不卡| 一本色道久久综合狠狠躁的推荐| 一区二区三区在线免费播放| 日韩精品一区二区三区在线| 成人高清视频在线| 丝袜亚洲另类欧美| 国产女人18毛片水真多成人如厕| 欧日韩精品视频| 国产精品一区二区久久不卡 | 日韩激情av在线| 亚洲欧美在线视频| 国产欧美精品一区aⅴ影院| 91精品国产手机| 欧美日韩国产片| 欧美日韩精品一区二区三区| 99re这里只有精品首页| 成人美女在线视频| 蜜臀a∨国产成人精品| 久久久另类综合| 91精品久久久久久蜜臀| 成人免费高清在线观看| 国产综合久久久久久鬼色 | 最新高清无码专区| 男女男精品视频| 中文字幕一区二区三区乱码在线| 欧美区视频在线观看| 91视频91自| 99精品视频中文字幕| 久久国产尿小便嘘嘘| 亚洲一区二区三区四区在线| 国产精品麻豆欧美日韩ww| 欧美xfplay| 精品久久久久久久久久久久久久久久久| 色狠狠色狠狠综合| 91麻豆精东视频| 麻豆精品一区二区综合av| 亚洲一区二区三区在线| 日本一区二区三区免费乱视频| 久久久精品国产免费观看同学| 在线成人av影院| 欧美不卡在线视频| 精品久久久久av影院| 国产丝袜在线精品| 亚洲精品中文字幕乱码三区| 又紧又大又爽精品一区二区| 亚洲另类在线视频| 一区二区三区在线视频播放| 伊人性伊人情综合网| 午夜视频一区二区三区| 日本女优在线视频一区二区| 三级精品在线观看| 韩国毛片一区二区三区| 春色校园综合激情亚洲| 欧美日韩一级片网站| 欧美私人免费视频| 欧美成人一级视频| 国产精品久久网站| 亚洲国产欧美一区二区三区丁香婷| 一区二区在线观看视频在线观看| 亚洲欧美日韩国产一区二区三区| 综合av第一页| 国产成人啪免费观看软件| av电影天堂一区二区在线观看| 91久久精品一区二区三区| 精品国免费一区二区三区| 国产精品每日更新| 蜜臀精品一区二区三区在线观看| 国产一区视频网站| 欧美日韩国产美女| 国产偷国产偷亚洲高清人白洁| 国产精品国产馆在线真实露脸| 香蕉影视欧美成人| 色猫猫国产区一区二在线视频| 亚洲精品一区在线观看| 欧美精彩视频一区二区三区| 日韩影视精彩在线| 欧美日韩国产一级二级| 国产精品不卡在线| av在线不卡网| 国产欧美日韩不卡免费| 精彩视频一区二区| 日韩美一区二区三区| 国产精品久久精品日日| 精品一区二区三区免费播放| 在线播放中文一区| 午夜亚洲国产au精品一区二区| 成人av网址在线观看| 欧美韩国日本一区| 成人网男人的天堂| 亚洲男人天堂av| 日韩欧美国产综合| 国产寡妇亲子伦一区二区| 久久久久9999亚洲精品| 成人精品视频一区二区三区| 国产精品美女久久久久av爽李琼| www.亚洲色图.com| 亚洲一区二区在线免费观看视频| 色哟哟一区二区| 久久精品国产精品亚洲精品| 久久免费偷拍视频| 91网站在线播放| 日本美女视频一区二区| 国产精品成人在线观看| 337p亚洲精品色噜噜狠狠| 成人综合婷婷国产精品久久蜜臀|