版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第React常見跨窗口通信方式實(shí)例詳解目錄iframe同源策略當(dāng)iframe與父窗口同源時效果圖當(dāng)iframe與父窗口不同源時效果圖跨窗口通信一:通過window.parent、frames、top效果圖二:window.postMessage其他通信方法
iframe
跨窗口通信就是在嵌套了iframe的時候,實(shí)現(xiàn)iframe與父窗口的通信。
什么是iframe
它是一個html標(biāo)簽,它可以將一個網(wǎng)站作為一個dom元素,嵌入到另一個網(wǎng)站中。iframe具有自己的window與document對象。
使用場景
比如公司開發(fā)了一個完整的網(wǎng)站,需要在另一個項目中去使用。比如直播功能,一些插件,這時候就可以使用iframe嵌入的方式。減少了重復(fù)開發(fā)的時間,需要修改界面的時候,也只需要修改一份代碼即可。微應(yīng)用,微應(yīng)用也有很多是使用iframe來實(shí)現(xiàn)。
同源策略
當(dāng)兩個網(wǎng)站同時滿足:同協(xié)議+同域名+同端口的時候。
當(dāng)iframe與父窗口同源時
父窗口可以對iframe進(jìn)行完全訪問,如window,document,location等對象的訪問。父窗口可以調(diào)用iframe的全局函數(shù)。父窗口可以修改iframe的元素內(nèi)容
效果圖
index1.html嵌套同源的index2.html
html1
body
h1html-1/h1
iframesrc=":3000/index2.html"frameborder="0"/iframe
script
constiframe=document.querySelector("iframe");
iframe.onload=function(){
console.log(iframe)
//獲取iframe的window對象
constiWindow=iframe.contentWindow;
//獲取iframe的document對象
constiDocument=iframe.contentDocument;
console.log(iWindow)
console.log(iWindow.location)
iWindow.say()
iDocument.body.innerHTML="h1thisishtml-1/h1"
/script
/body
html2
body
h1html-2/h1
script
functionsay(){
console.log("saying!!!")
/script
/body
效果圖
index1.html嵌套同源的index2.html
發(fā)現(xiàn)子iframe的window,document,location對象,以及子iframe的全局方法都可以訪問。
當(dāng)iframe與父窗口不同源時
父窗口無法訪問iframe的window的所有屬性與方法。父窗口無法訪問iframe的document。無法調(diào)用iframe的全局方法。
跨窗口通信
一:通過window.parent、frames、top
window.frames:獲取子iframe的列表,與document.querySelector(iframe)一樣
window.parent:獲取父window的引用
window.top:獲取最頂層窗口的window引用
上一節(jié)我們講到,當(dāng)iframe同源時,不同窗口可以拿到對方的window對象,以及全局方法,那么我們可以利用全局方法來實(shí)現(xiàn)不同window窗口的通信。
html1
body
h1html-1/h1
div
button發(fā)送數(shù)據(jù)給html2/button
/div
iframesrc=":3000/index2.html"frameborder="0"/iframe
script
constiframe=document.querySelector("iframe");
letsend;
iframe.onload=function(){
//獲取iframe的window對象
constiWindow=iframe.contentWindow;
//獲取iframe的document對象
constiDocument=iframe.contentDocument;
functionreceive(value){
console.log("這是html1,來了一條數(shù)據(jù):",value)
send=function(value){
iWindow.receive(value)
/script
/body
html2
body
h1html-2/h1
div
button發(fā)送數(shù)據(jù)給html1/button
/div
script
functionreceive(value){
console.log("當(dāng)前是html2,收到一條數(shù)據(jù):",value)
functionsend(value){
window.parent.receive(value)
/script
/body
效果圖
同理,window.top也可以這樣通信
二:window.postMessage
postMessage支持不同窗口之間的通信,即使是非同源的情況。
發(fā)送數(shù)據(jù)
當(dāng)需要使用給其他窗口(window)發(fā)送數(shù)據(jù)時,需要調(diào)用對方window的postMessage方法。
該方法接收兩個參數(shù)
參數(shù)一:需要發(fā)送的數(shù)據(jù),數(shù)據(jù)最后為字符串形式,因?yàn)镮E只支持字符串?dāng)?shù)據(jù)。參數(shù)二:接收方的地址(協(xié)議+域名+端口)
接收數(shù)據(jù)
監(jiān)聽message事件
該事件對象包含接收的數(shù)據(jù),以及發(fā)送方的地址等信息。
html1
body
h1html-1/h1
div
button發(fā)送數(shù)據(jù)給html2/button
/div
iframesrc=":3001/index2.html"frameborder="0"/iframe
script
constiframe=document.querySelector("iframe");
letsend;
iframe.onload=function(){
//獲取iframe的window對象
constiWindow=iframe.contentWindow;
send=function(value){
iWindow.postMessage("wuwuwuw",":3001")
window.addEventListener("message",function(event){
if(event.origin!=':3001'){
//過濾指定地址的信息
return;
if(window==event.source){
//頁面初始化的時候會被瀏覽器觸發(fā)一次message,在這里根據(jù)發(fā)送方地址進(jìn)行過濾
return
console.log("html1收到的數(shù)據(jù)"+event.data);
/script
/body
html2
body
h1html-2/h1
div
button發(fā)送數(shù)據(jù)給html1/button
/div
script
functionreceive(value){
console.log("當(dāng)前是html2,收到一條數(shù)據(jù):",value)
functionsend(value){
window.parent.postMessage(value,":3000")
window.addEventListener("message",function(event){
if(event.origin!=':3000'){
//過濾指定地址的信息
return;
if(window==event.source){
//頁面初始化的時候會被瀏覽器觸發(fā)一次message,在這里根據(jù)發(fā)送方地址
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026貴州中醫(yī)藥大學(xué)博士后招聘備考題庫及1套完整答案詳解
- 2026貴州醫(yī)科大學(xué)附屬白云醫(yī)院養(yǎng)老護(hù)理員招聘8人備考題庫及答案詳解(奪冠系列)
- 寶寶皮膚護(hù)理與預(yù)防濕疹
- 2025 小學(xué)一年級道德與法治上冊獨(dú)自在家不害怕課件
- 2026年工地安全管理標(biāo)準(zhǔn)化建設(shè)
- 遠(yuǎn)程會診護(hù)理的經(jīng)濟(jì)效益
- 職業(yè)醫(yī)學(xué)與工程學(xué)的聯(lián)合防護(hù)模式
- 臨潭事業(yè)編招聘2022年考試模擬試題及答案解析42
- 職業(yè)健康素養(yǎng)對醫(yī)療員工組織承諾的預(yù)測作用
- 職業(yè)健康檔案電子化傳輸過程中的加密技術(shù)應(yīng)用
- 骨密度檢測的臨床意義
- 鉆探原始班報表試行版
- 腸菌移植治療炎癥性腸病專家共識(2025)解讀
- T/CPPC 1032-2021建筑生產(chǎn)資源分供商評價規(guī)范
- 機(jī)耕合同協(xié)議書范本簡單
- 送車免責(zé)合同協(xié)議書模板
- 外科學(xué)重癥監(jiān)測治療與復(fù)蘇
- 瓊脂糖-纖維素復(fù)合分離介質(zhì)
- 早產(chǎn)兒家庭參與式護(hù)理
- 2025年招商引資項目可行性研究報告范文
- 常見的鹽(第1課時)-九年級化學(xué)人教版(2024)下冊
評論
0/150
提交評論