2009-02-18 75 views
4

我正在進行一個站點間單點登錄項目,並且在我的腿上掉了一個很小的問題。當用戶退出「父」站點時,需要在包含「子」站點的彈出窗口中加載特定頁面。但是,我無法存儲對window.open(…)的返回值的引用,因爲在註銷之前必須允許用戶在每個站點上隨意導航。是否有可能確定一個命名窗口是否在JavaScript中打開?

如果我可以假設子站點始終打開,那麼這很容易,因爲到同一命名窗口的另一個window.open(…)將更改其URL。但是,彈出式窗口如果尚未打開(不是所有用戶都有權訪問子站點),則不會導致出現

我認爲這給了我兩個衝突的情況。當用戶訪問子站點時:

  1. 用戶登錄到父站點。
  2. 用戶點擊子網站的鏈接
  3. 子網站出現在名爲「child_popup」的窗口中。
  4. 用戶在父網站中瀏覽的範圍很廣,忘記了子窗口存在。
  5. 用戶註銷父站點。
  6. 子彈出被重定向到子站點的註銷頁面。

,並在用戶沒有或不能訪問子站點:

  1. 用戶登錄到父站點。
  2. 用戶在父網站中瀏覽的範圍很廣。
  3. 用戶註銷父站點。
  4. 不應該彈出窗口!

所以我的限制是:

  • 我不能儲存在JS窗口的引用,因爲用戶可以導航到任何數量的訪問子站點和退出之間的頁面。
  • 我有控制子站點的內容(我的僱主運行父站點)。
  • 父站點無法轉換爲框架以提供「全局」JS範圍。 :-)

我無法在Google或SO上找到任何相關資源。有沒有辦法做到這一點?

回答

1

我們無法找到一種方法來檢測子站窗口是否仍然開放,但我們想出了這滿足了我們的業務需求鄉親解決方法:

  1. 設置cookie的A在啓動子彈出時從父站點發出。
  2. 從每個頁面加載的子站點設置Cookie B.
  3. 從每個頁面上的子站點清除cookie B un加載。
  4. 當註銷父站點:
    1. 如果有cookie設置,明確並關閉本地連接到子站點。
    2. 如果設置了cookie B,清除它並在彈出窗口中打開子註銷頁面。
0

使用會話來存儲彈出窗口的狀態。

當用戶點擊一個鏈接打開子站點時,你需要做一個異步的JavaScript調用到父服務器,記錄這個用戶已經打開一個窗口到子站點。或者讓鏈接打開存儲以下會話信息的頁面並返回Location:標頭。

(注意我正在使用php,$ _SESSION [...]是數據存儲的請求之間的用戶特定陣列)

$_SESSION['inChildSite'] = true; 

當用戶退出父站點的,該值被再次檢查,或者通過一個asycnronous javascript調用,或者通過註銷腳本。

if ($_SESSION['inChildSite'] ==true) 
    echo "<script>window.open(...)</script>" 

然後顯示註銷子窗口。確保在註銷發生時取消設置會話變量。

瞧,利潤。

+0

不幸的是,我沒有訪問服務器端會話數據(讀*或*寫)。從本質上講,我被要求在純JS中做到這一點。我現在正在推動,看看我能否得到一組更合理的要求。 – 2009-02-18 23:44:36

3

是的,你可以,受到一個重要的限制。

這取決於以下行爲:

  1. 第2個參數的window.open是一個URL和一個窗口名稱
  2. 如果一個窗口window.open返回到窗口
  3. 參考已經以指定名稱打開,則返回對該窗口的引用,而不是對新窗口的引用
  4. 如果URL爲NULL,則現有窗口將不會導航到新頁面

這意味着您可以獲取對現有窗口的引用,而不會丟失窗口打開的頁面。但是,如果一個窗口不存在與該名稱存在,它將打開

我們用這種方法在http://carbonlogic.co.uk/但由於Flash Player的問題的彈出窗口的內容不正確的時刻

+0

這真的很巧妙,但恐怕它實際上與我們所需要的相反。如果窗口打開,我*希望頁面改變;我*不*想要一個新的窗口彈出,如果不是。 : - / – 2009-02-19 00:33:11

0

工作聽起來好像你是在子窗口中的內容控制..如果是這樣,你可以嘗試設置「window.opener.some_attr = true」,當你第一次加載子窗口。因此,你的代碼在父窗口可以做「if(window.some_attr)window.open(...)」或相反的「if(!window.some_attr)alert('no access')... 「

相關問題