Iframe
```
**child.html**
```js
iframe-child
```
UI
![image.png](http://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2feb56ff5e9d4a22999eb197aaa3145e~tplv-k3u1fbpfcp-watermark.image?)
**2.postMessage**
先簡單瞭解一下postMessage的功能,來源[MDN](http://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage)。
window.postMessage() 方法可以安全地實現跨源通訊。
語法
```js
otherWindow.postMessage(message, targetOrigin, [transfer]);
```
> otherWindow
>
> 其他視窗的一個引用,比如iframe的contentWindow屬性、執行window.open返回的視窗物件、或者是命名過或數值索引的window.frames。
>
> message
>
> 將要傳送到其他 window的資料。它將會被結構化克隆演算法序列化。這意味著你可以不受什麼限制的將資料物件安全的傳送給目標視窗而無需自己序列化。[1]
>
> targetOrigin
>
> 通過視窗的origin屬性來指定哪些視窗能接收到訊息事件,其值可以是字串"*"(表示無限制)或者一個URI。在傳送訊息的時候,如果目標視窗的協議、主機地址或埠這三者的任意一項不匹配targetOrigin提供的值,那麼訊息就不會被髮送;只有三者完全匹配,訊息才會被髮送。這個機制用來控制訊息可以傳送到哪些視窗;例如,當用postMessage傳送密碼時,這個引數就顯得尤為重要,必須保證它的值與這條包含密碼的資訊的預期接受者的origin屬性完全一致,來防止密碼被惡意的第三方截獲。如果你明確的知道訊息應該傳送到哪個視窗,那麼請始終提供一個有確切值的targetOrigin,而不是*。不提供確切的目標將導致資料洩露到任何對資料感興趣的惡意站點。
>
> transfer 可選
>
> 是一串和message 同時傳遞的 Transferable 物件. 這些物件的所有權將被轉移給訊息的接收方,而傳送一方將不再保有所有權。
**iframe.html**
父頁面通過postMessage向子頁面通訊,將targetOrigin設定為'*',不做同源限制。
```js
iframe
```
**child.html**
子頁面使用window.addEventListener監聽父頁面message事件,回撥事件可以從event.data中獲取到父頁面傳遞的data。
```js
iframe-child
```
**UI**
![image.png](http://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/82bd56d28d024a22a9b54cecaa0e8cab~tplv-k3u1fbpfcp-watermark.image?)
#### 6.2.2 子頁面向父頁面傳遞資料
子頁面通過也可以通過postMessage向父頁面傳遞資料,不同的是otherWindow為父頁面視窗,所以子頁面需要使用window.parent表示父頁面視窗(見4.2)。
**child.html**
子頁面通過postMessage向父頁面通訊,將targetOrigin設定為'*',不做同源限制。
```js
iframe-child
```
**iframe.html**
父頁面使用window.addEventListener監聽子頁面message事件,回撥事件可以從event.data中獲取到子頁面傳遞的data。
```js
iframe
```
**UI**
![image.png](http://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2864099d0b35498c89c4ae97d50bbaa8~tplv-k3u1fbpfcp-watermark.image?)
## 七、總結
溫故而知新,可以為師矣。古人誠不欺我。
通過再次學習iframe,對iframe瞭解加深,且對於之前時常記憶不深的跨域解決方案有了更深刻的記憶。
時不我待,感謝不斷堅持的自己,加油!