iframe 通訊和跨域通訊

2021-07-13 04:24:24 字數 2199 閱讀 4784

幾年前頁面裡使用iframe巢狀使用的還是很多的。

以下是多種使用方法:

1、同域下巢狀:

父頁面:

window.οnlοad=function()

function fu()

子頁面:

父頁面呼叫子頁面:

iframename.window.document.xx

iframename.window.function

idel.contentwindow.document.xx

idel.contentwindow.function

子呼叫父頁面:

parent.document.xx

parent.function

2、跨域下hash傳遞值:

在頁面如果只是修改了url的標籤符頁面是不會重新整理的。

但會觸發hashchange方法

可以利用這個來實現雙方通訊

父頁面:

子頁面:

修改hash傳遞值
父和子頁面繫結onhashchange

通過location.hash來獲取#xx

父頁面修改url

idel.contentwindow.location.href='xx#xx'

子頁面修改url

window.parent.location.href='xx#xx'

3、子頁面單方面傳遞值到父通過window.name 或#has

window.name屬性它不論同源,只要在同一視窗,前頁面修改了name,後載入的頁面是可以訪問到的。

可以利用這點在b.com頁面下設定name然後跳轉到a.com b的頁面。

此頁面獲取到name再呼叫父頁面也就是a.com a的方法了。

或者a頁面監聽firame的load事件然後獲取name

其實b.com頁面可以通過url把值傳遞給a.com b。

b收到後因為是同源所以可以呼叫父方法和el把值傳遞。

a.com a:

b.com 

傳遞值

a.com b:

以上這些取巧的方法以前是經常用的。

現在有了html5,有了新的辦法:

4、postmessage

為window增加了postmessage(),允許跨域通訊

其引數1:傳送的內容,引數2是接收訊息的視窗的源,也就是url,當然也可以用*.向所有視窗傳送

子視窗向父視窗也類似:

opener.postmessage('xx','url')

opener 屬性返回建立此視窗的window物件引用

父子視窗通過監聽message來獲取值

event.source 傳送訊息視窗

event.origin:訊息發向的視窗

event.data訊息內容

source 可判斷傳送源url,進行過濾

父頁面:

frame color

子頁面:

click to change color

還有一種跨域寫法:

a.com 上的a頁面巢狀了b.com 上的b頁面。b需要和a通訊。

b頁面上又巢狀 了a.com 上的c頁面。

b頁面不直接和a頁面通訊,b修改c url 的hash。

c監聽onhashchange獲取值。

由c和a頁面通訊,因為c和a是在同域下的。

c可以用parent.parent.fn() 來向a傳遞值。

因為是三層巢狀所以要兩次parent.

通過iframe實現post 提交。

以前在post提交時form 時不想跳轉頁面,就有一利用target 提交到iframe

iframe來接收資訊。

如果想父頁面知道接收資訊,可以在伺服器返回時輸出script 

window.parent.fn(xx) 呼叫父級方法把資訊傳遞。

iframe跨域通訊

簡述 window.postmessage方法,允許跨視窗通訊,不論這兩個視窗是否同源。視窗都可以通過message事件,監聽對方的訊息。語法 otherwindow.postmessage message,targetorigin,transfer message 傳送的內容。targetorgi...

iframe跨域通訊

重點來了 貼 父級頁面傳送資訊給子級 var son document.getelementbyid st st為子級iframe的id url可以為純網域名稱也可以為 當為 時所有子級都會接收到 當為純網域名稱時,只有這個網域名稱才會收到 url message為你要傳送的訊息 message 我...

iframe跨域通訊 postMessage

一 跨域通訊概述 messageevent 四個屬性 message 型別 data window.postmessage的第乙個引數 origin 呼叫postmessage時頁面的當前狀態 source 呼叫postmessage的視窗資訊 二 postmessage語法 window.post...