2009-09-30 91 views
5

我有一個頁面上的腳本www.example.com/index.html打開home.example.com/foo .html在一個彈出窗口中。當用戶關閉彈出窗口時,我想通過調用一個Javascript函數來通知開啓者頁面(它對DOM做了一些事情)。我用unbeforeunload這樣的:在IE中設置document.domain後讀取window.location(6)

// In index.html on www.example.com: 
    window.fn = function() { /* Perform stuff after foo.html has closed */ } 

    // In foo.html on home.example.com: 
    window.onbeforeunload = function() { 
     if (window.opener && window.opener.fn) 
      window.opener.fn(); 
    }; 

這不起作用,因爲網頁都在不同的領域。我可以設置document.domain屬性來解決這個問題:

document.domain = "example.com"; 

不幸的是,這不符合Web應用程序框架,我就foo.html側(阿帕奇檢票)使用打得很好,因爲它包含一個腳本,做是這樣的:

var src = (window.location.protocol == 'https:') ? something : other; 

顯然,在IE6 *,當您設置文檔領域,location對象變成只寫,所以試圖讀取window.location.protocol拋出「拒絕訪問」。

所以,我的問題是:如何允許跨域Javascript函數調用,同時仍允許我的腳本讀取location對象的內容?

  • 我不能通過服務器去。 (我想要調用的函數所做的工作並不是真的那麼起作用。)
  • 我在設置document.domain之前無法讀取window.location.protocol屬性,然後在條件賦值中使用該值;這樣做會要求我重新構建Web框架庫 - 這不是我想要做的事情。

*可能在IE中,也與其他版本;沒有檢查過。

回答

1

你可以使用jQuery嗎?有一個不錯的插件可以讓你通過IE6-8中的iframe做window.postMessage:http://benalman.com/code/test/js-jquery-postmessage/

你可以從iframe中打開你的彈出窗口,並通過postMessage在iframe和parent之間傳遞你的對象。

+0

這可能是我最棒的一拍。謝謝。 – gustafc 2009-10-07 06:50:36

0

我不能設置document.domain的前閱讀 window.location.protocol財產 和 然後使用該值在有條件 分配;這樣做會要求我 重建網絡框架庫 - 不是我想要做的事情。

在設置document.domain和設置window.location.protocol之前,您不能讀取window.location.protocol一旦它變爲只寫?這是否需要重建框架?這是一個黑客,但IE瀏覽器也是如此。

+0

不幸的是,它不起作用。即使在寫入之後,它仍然是隻寫的。 – gustafc 2009-10-01 07:26:32