前後端跨域有很多中辦法,但最近工作中出現的跨域情況,想來想去還是覺得postMessage比較好用。
前提:跨域和被跨域的一方都是你可以控制的,一方寫發送消息的,另一方寫接收消息方法
一:情景:
在我們的頁面中用iframe嵌套一個外域頁面,外域頁面點擊“創建”後,要返回我的頁面保存後的 id 值。
因爲我的頁面和他的頁面跨域,無法獲得他點擊保存的點擊事件,所以我無法知道他啥時候保存的,他保存的id也沒法傳給我
二.postMessage概念
在同一window中,h5有個api叫postMessage,從字面意思就知道是“發送消息”的意思。
前提:跨域和被跨域的一方都是你可以控制的,一方寫發送消息的,另一方寫接收消息方法
1.發送消息:
window.postMessage('這是要發送的消息','*');
有兩個參數,第一個參數是要發送的信息,可以是字符串也可以是json字符串,可傳遞較多信息。第二個參數是可以指定域名,也就是說只有符合這個域名才他發消息,如果寫“*”的話不管域名是啥,只要在同一個window就給它發消息。
var message={
event:"saveSuccess",
data:{
channelId:self.marketingform.type,
beginDate:self.marketingform.startTime,
endDate:self.marketingform.endTime,
svcType:obj.resultData.svcType
}
}
window.postMessage(JSON.stringify(message),'http://www.xxx.com');
2.接收消息:
window.parent.addEventListener("message",function(res){
console.log(res)
})
接收到的消息是一個對象,數據在data中
注意這跨域的侷限性在於必須在同一個window對象上,也就是說哪個window發送消息,只有本window才能接收到。
因爲收發消息都是js代碼,所以這本質是用js的方法跨域,雙方都要寫js
三.總結
postMessage跨域的精髓就是不管你倆是否跨域,只要你倆能跟一個window扯上關係,那就能傳消息,收到消息就可以處理下一步事物
比如我開頭的場景,因爲iframe的window和我的頁面的window不是一個window,所以iframe保存完發消息要用window.parent.postMessage發送,而我的頁面直接用window.addEventListener接收,接收到保存成功的消息後,將返回的id保存。
兩個同域的window如果不是同一個window也是不能收發消息的,如
兩個選項卡之間是不通的。
窗口間的通訊只能是一個頁面嵌入多個iframe,多個iframe因爲能靠主頁面找到同一個window,才能做到多頁面消息傳遞