2009-05-22 73 views
1

我正在處理的應用程序有多個模塊。兩個是我所關心的 - 主要模塊和模塊。我必須在包含主模塊的窗口上調用一個函數,問題是我不得不從父webmodule打開的頁面調用該函數,而是從用戶從此頁面導航到的頁面調用該函數。在頁面導航中傳播opener變量的最佳方法?

基本上第一頁只展示了一些查詢表單,讓用戶做了一些查詢,第二頁保存了查詢結果,我應該基於這些結果更新父頁面的內容。

導航是這樣說

  • 主模塊我模塊的
  • 第一頁(我有主模塊頁面爲window.opener變量。
  • 我模塊的第二頁(我想是能夠在第一個打開的同一瀏覽器窗口中打開此頁面)

我希望儘可能使用免費導航 - 就像打開查詢結果一樣新選項卡,返回更改查詢參數,創建新查詢等。我還想在顯示結果的頁面上顯示用戶查詢表單,並讓它們優化此查詢,並且仍能夠更新主模塊。

我想以下解決方案:

  1. 使用AJAX來加載查詢結果第一個窗口,但我想有這個應用程序儘可能簡單,而AJAX就是不簡單;)
  2. 在每個請求中產生新窗口並執行類似var mainModule = opener.mainModule的代碼。這是邪惡的。
  3. 將查詢結果嵌入到框架或iframe中,但我對如何將主模塊窗口javascript變量注入到框架或iframe中有絲毫的想法。
+0

我在考慮我的迴應。但首先我想評論一下你想讓用戶能夠在標籤頁中打開這些頁面(第一頁和第二頁等)。請注意,當頁面在選項卡中打開時,大多數瀏覽器都會切斷「開啓者」的鏈接。其次是你的「查詢和查詢結果」全部是從「你的」模塊完成的,而不是「主」模塊?第三,所有頁面都在同一個域上嗎?如果你可以澄清,(最好有一個簡單的示例結構),這將是有益的。謝謝。 – 2009-05-22 13:36:01

回答

2

如果能夠在製表符中導航是一項要求,我認爲您必須使用JavaScript打開窗口系統的想法。由於在Firefox,Safari和大多數瀏覽器中,當您導航到不同的窗口時,opener屬性肯定會丟失。一個新選項卡擾亂整潔的沙盒。

由於不是必需的,按你的意見,我想你可以使用的3種方法之一:

  • 親子窗口communication--我會佔用 未來;
  • XMLHTTP請求(又名。 AJAX);或
  • 的iFrame(舊的方式 到遠程服務器:)

我會好好家長親子溝通角,在這裏,因爲你似乎是最舒服用它。

  1. 「兒童」窗口中的導航之間很容易。
    • 頁面上的任何鏈接都加載到子中並共享相同的「開啓者」。
    • 父母可以重新加載不同的頁面,並共享相同的開啓者。
  2. 將有一個父監聽器功能在孩子;
  3. 孩子將有一個單獨的f 聯合聲明父母。
  4. 父母將有一個或多個子聽衆,具體取決於通用性或特定需求。

我已經更新(不完全)我幾年前寫了一篇文章,讓你玩的窗戶和實際做最小的表單提交。通信警報相當詳細;但是你會毫不懷疑誰在向誰傳達什麼。第一個孩子煩惱地打開onload。但是頁面上有一個鏈接可將該子項更改爲服務器生成的表單。

JavaScript: Beyond Parent Child Windows


實施例的代碼片斷:

鏈接

<a href="page1.html" id="newwinlink">open a window from link</a> 

鏈接監聽

事件監聽器和目標屬性被設置在文件的頭部,在JavaScript執行的onload:

var mywin; //global variable for best results 

//XDOM - normalizes browser differences: 
var openingLink = XDOM.getElementById('newwinlink'); 
openingLink.target = "newWin"; //important! 

XDOM.addListener(openingLink, 'click', function(e){mywin=window.open('','newWin','width=400,height=400,resizable,scrollbars');if (!mywin.opener){mywin.opener = self;}return true}, false); 

子文檔 - 家長監聽

function parentListener(pmsg) 
{ 
    alert("I'm the child, and I just received the following message from my parent:\n\n" + pmsg); 
} 

子文檔 - 與父母交談

function talktoParent() 
{ 
    if (self.opener!=null) { 
     opener.childListener("Hi from child window!"); 
    } else { 
     alert("no opener... sorry, can't talk now"); 
    } 
} 

父文檔 - 兒童監聽

function childListener(cmsg) 
{ 
    alert("I'm the parent. Just received the following message from my child:\n\n" + cmsg); 
    //send back a message to the child, mywin... 
    mywin.parentListener("Hi, back, from parent window!"); 
} 

這些都是簡單的。但是您可以在上面提供的鏈接中看到開啓者的連續性,導航以及服務器端回傳和Parent之間的通信。

再一個缺點是,在另一個選項卡中打開這些選項將會失去與父項的連接。在我發給你的網頁上試試。我相信孩子會提醒你,它已經與其「開瓶器」斷開。

隨意提問,jb。

0

iirc,即使您在由window.open打開的窗口中導航離開原始文檔後,window.opener仍然可用。