2012-11-11 43 views
11

我的主要目標是:我如何發送一個事件從子窗口到它的父窗口

要我的應用程序,在新標籤頁中打開鏈接存在,使一些在新的標籤,併發送一個事件到父 - 主標籤刷新。

我已經學會2項技術,不這樣做正是我需要的:

  1. 的postMessage - 因爲據我所知,只有在IFRAME而不是標籤
  2. window.opener工程 - 僅適用與window.open(URL),只打開新窗口,而不是新標籤。

如何使用選項卡將事件從子項傳遞給父項?我很樂意爲父代和子代中的JavaScript代碼的特定示例。它應該適用於跨域(例如:www.mydomain.com和bills.mydomain.com)。

有沒有我缺少的jQuery解決方案?

+1

我相信'window.open'應該返回一個新的_Window_對象,並且如果你沒有遇到同樣的起源策略的問題,你可能能夠將一個監聽器從父對象附加到這個對象上,或者設置一個間隔檢查一些變量。 –

+0

@PaulS。,它window.open不會在新標籤中打開。 – Alon

+0

@Alon它在Firefox中執行。 –

回答

6

下對我的作品在Chrome,火狐,IE瀏覽器(沒有測試更多的瀏覽器)

假設3個文件

  1. www.mydomain.com/parent.html),其中包含了「main'文檔與鏈接
  2. bills.mydomain.com/child.html),將通過鏈接打開的頁面的頁面
  3. www.mydomain.com/dispatcher.html)以後

首先闡述在parent.html創建所有3個文件的域屬性設置爲mydomain.com

<script> 
document.domain="mydomain.com"; 
</script> 

隱藏的iframe,其名稱屬性爲例如「hiddenframe」。同時創建一些可能稍後會收到響應的函數。

parent.html現在應該是這樣的:

<script> 
document.domain="mydomain.com"; 
function fx(msg)//receives the response 
{ 
    alert(msg) 
} 
</script> 
<iframe name="hiddenframe" style="display:none"></iframe> 
<a href="http://bills.mydomain.com/child.html" target="_blank">click</a> 

在child.html你現在就可以將文檔加載到隱藏的iframe內parent.html

<script> 
document.domain="mydomain.com"; 
window.open('http://www.mydomain.com/dispatcher.html','hiddenframe'); 
</script> 

(不要混淆在面對使用window.open()這裏,不會打開一個新窗口,頁面會被加載到parent.html中的iframe中)


在dispatcher.html中,您現在可以調用父代中的函數。HTML

<script> 
document.domain="mydomain.com"; 
parent.fx('you just got some response'); 
</script> 

當你只需要重新加載它是一個有點容易的parent.html。

再次設置在parent.html和child.html的document.domain的屬性(你不需要在parent.html iframe和dispatcher.html)

在parent.html還設置了窗口的名稱 - 屬性,例如

<script> 
    window.name="parentTab"; 
</script> 

在child.html你現在可以訪問parentTab -window(標籤)

<script> 
    document.domain="mydomain.com"; 
    window.open('http://www.mydomain.com/parent.html','parentTab'); 
</script> 

......或者乾脆用「parentTarget」作爲孩子一個鏈接或表單的目標特性。 HTML

0

我爲自己做了些什麼,我實現了一些ajax將更改從window2提交到數據庫。我Implemeted一個JSON從數據庫中拉回來的新數據WINDOW1

0

討論怎樣similar questions只談window.open(你不想使用)和AFAIK有沒有簡單的方法來get all windows on the same domain,你想要的東西,你可能需要編寫自己的框架來做到這一點使用window.sessionStorage
雖然我不認爲你可以訪問子域名,但絕對不能訪問其他域名。


特定窗口的消息實際的想法傳遞使用sessionStorage ..
可以傳遞的東西在URL(GET),這樣的方式來傳遞消息可能使父母產生一個唯一的ID爲自己parentID ,它的小孩的唯一ID爲childID(如果您使用的是<a>,則會將其插入到URL中,並與parentID一起單擊,或者如果您不介意<form method="GET">則爲隱藏字段),然後使用sessionStorage將消息保存到父母使用像parentID.childID.timeStamp這樣的密鑰,在父母和孩子中都有間隔sessionStoragek eys從窗口的ID開始,然後是.(即,父母查找parentID.)在匹配上將密鑰&值複製到新的var,delete(因此它不會再次找到),然後根據需要進行解析。

我知道這有點羅嗦,但我認爲它可能比編寫工作示例代碼更容易解​​釋爲一個概念。

相關問題