我不是JSONP的粉絲,它創建的數據和表現之間的耦合,所以我之前研究這個問題,那麼,有一個技巧,你可以使用,按照這個:
假設我們有主窗口命名爲A和B.命名 A和B必須來自同一個主機提供的iframe的「孩子」窗口,但可以有不同的子域,是這樣的:
A從SUB1服務.example.com
B由sub2.example.com提供
瀏覽器讓你修改文檔的領域,但仍然限制你在那,所以你只能通過直至到達主機中移除子域更改域,並因此在您更改域名,如所以:
document.domain = "example.com";
B中你第一次做一個AJAX調用其領域(sub2.example.com),然後將第一個請求發送後您更改域名就像一個,因此這兩個文檔有相同的域。 由於您向B中的原始域發出了請求,因此瀏覽器將允許您繼續向其發送請求,但由於您也更改了域,現在A和B具有相同的域,因此它們可以相互通信。
在更改域之前,首先在B中將至少一個請求發送到其原始域是很重要的。 同樣,如果兩個頁面不是從同一個主機提供的,它不會工作,所以在大多數情況下它不能解決問題,但它確實讓您有更多的操作空間。
我不止一次使用過這個技巧,並且沒有遇到任何問題,據我所知,它在所有瀏覽器中都可以使用,如果在某些情況下它不適用,請告訴我。
這裏有一個僞例如:
in A
==================
document.domain = "example.com";
var child; // keep reference to B
function setChild(win) {
childDocument = win;
}
function handleMessage(message) {
do what ever it is you need to
}
in B
==================
make ajax request
document.domain = "example.com";
parent.setChild(this);
function ajaxCallback(message) {
parent.handleMessage(message);
}
這聽起來像一個錯誤或漏洞。你測試過哪些瀏覽器? – Halcyon 2012-01-31 20:23:04
它適用於IE,Chrome。我沒有在Firefox中測試 – emphaticsunshine 2012-01-31 20:24:57
我不確定'window.location.host',但更改'document.domain'確實允許同一父域中的兩個不同的子域進行通信。 https://developer.mozilla.org/zh/Same_origin_policy_for_JavaScript – djd 2012-02-08 02:07:51