2011-05-16 72 views
2

子窗口的父窗口傳遞數據我有兩個域說,X和Y,都是不同的服務器具有不同的IP上。從一個域到另一個DOMIAN

現在的情況是,域X的一個頁面上有是打開域名爲Y.上彈出一些數據

用戶搜索彈出一個鏈接,然後點擊「完成」

單擊與搜索字段相關的值應傳遞到域X上的頁面。

我正在使用PHP,HTML和js。

P.S:當域名是相同的,但我想在那裏的域名和服務器是不同的解決方案中的事情的作品。

+0

看看這個JSONP的例子:http://www.ibm.com/developerworks/library/wa-aj-jsonp1/ – wdm 2011-05-16 06:36:08

回答

2

你需要調查

CORS(較舊的IE則需要XDR)或

window messaging

JSONP

通過URL

+1

我在讀它,雖然一個演示代碼將是非常可觀的 – 2011-05-16 06:25:21

+0

有各地的演示。首先想想我們想要使用哪種技術。很抱歉,我沒有時間粘貼4個示例或從頭開始編寫一些示例,因爲我需要在兩個域/子域上使用代碼。如果您可以完全訪問這兩個域的代碼,請嘗試CORS。 – mplungjan 2011-05-16 06:29:10

+0

好的,謝謝我會嘗試CORS並檢查它是否可以解決我的問題 – 2011-05-16 06:41:38

5

我送變量只是想補充一點,那就是poss IBLE從一個窗口,一個域的數據傳遞到一個窗口經由window.name屬性另一個域。當然,這個屬性是不是爲了這個目的,並語言純化論者會恨我,這。然而,這是它是如何做的,快速和骯髒的:

在域X:

var PREFIX = "your prefix here"; 
// The second parameter of window.open() sets window.name of the child window. 
// Encode JSON and prepend prefix. 
window.open("http://domain-y.example.com/", PREFIX + JSON.stringify({"foo":"bar", "abc":123})); 

在域Y:

var PREFIX = "your prefix here"; 
if(window.name.substr(0, PREFIX.length) == PREFIX){ 
    // Remove prefix and decode JSON 
    var data = JSON.parse(window.name.substring(PREFIX.length)); 
    // Do what you need to do with the data here. 
    alert(data.foo); // Should alert "bar" 
} 

PREFIX是可選的,但我更喜歡把它列入情況域Y由設置window.name屬性的其他頁面訪問。還要注意,你並不需要使用JSON(如果你正在處理恐龍瀏覽器,你不應該這麼做),但是我喜歡JSON,因爲我可以在一個對象中傳遞多個屬性。

編輯:如果你需要結構域是將數據傳回域X,你可以有結構域是在window.name保存數據並導航到域X的一個匆匆過客頁面,該頁面可以很容易地將數據傳遞給原來的窗口。試試這個:

在域Y:

// Somewhere earlier in the code: 
var PREFIX = "your prefix here"; 
// Call this function when the Done button is clicked. 
function passDataBack(data){ 
    window.name = PREFIX + JSON.stringify(data); 
    window.location = "http://www.domain-x.com/passer.html"; 
} 

http://www.domain-x.com/passer.html

// Somewhere earlier in the code: 
var PREFIX = "your prefix here"; 
if(window.name.substr(0, PREFIX.length) == PREFIX){ 
    // Remove prefix and decode JSON 
    var data = JSON.parse(window.name.substring(PREFIX.length)); 
    // Send data to parent window 
    window.opener.processData(data); 
} 

在原來的頁面,應該有一個叫做processData函數,它的數據,並做一些事情吧。

+2

這是一個很棒的黑客攻擊。我已經在生產中使用它,沒有任何問題。 – Shobhit 2016-04-11 12:37:53

1

我知道這是一個老問題,但我覺得這可能是一個更合適的問題的答案

應該將下面的代碼添加到http://domain-x.com

window.addEventListener("message", function(event) { 
    console.log(event.data); // {user: 'data'} 
}, false); 

...在在http://domain-y.com

userClicksDone() { 
    try { 
    // This may throw an error in case of people access 
    // http://domain-y.com directly, not via popup from 
    // http://domain-x.com 
    // 
    window.opener.postMessage({user: 'data'}, 'http://domain-x.com'); 
    } catch(e) { } 

    // Closes this popup 
    // 
    window.close(); 
} 

更多信息在Mozilla。 致信@mplungjan