html5 postMessage的跨域問題

前後端跨域有很多中辦法,但最近工作中出現的跨域情況,想來想去還是覺得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,才能做到多頁面消息傳遞

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章