io non sono un fan di jsonp, si crea l'accoppiamento tra i dati e la presentazione, e così ho studiato questo problema prima, e bene, c'è un trucco che è possibile utilizzare, seguire questa:
diciamo noi avere la finestra di nome principale a e la finestra "bambino" nel iframe chiamato B. a e B devono essere serviti dallo stesso padrone di casa, ma può avere diversi sottodomini, qualcosa di simile:
a è servita da sub1 .example.com
B viene fornito da sub2.example.com
i browser ti consentono di modificare il dominio del documento, ma ti restringono comunque, quindi puoi solo cambiare il dominio rimuovendo i sottodomini fino a raggiungere l'host, quindi in A puoi cambiare il dominio, ad esempio così:
document.domain = "example.com";
in B per la prima volta fa una chiamata AJAX al suo dominio (sub2.example.com), poi, dopo la prima richiesta è stata inviata voi cambiare il dominio proprio come in a, in modo che entrambi i documenti hanno la stesso dominio. dal momento che hai fatto una richiesta al dominio originale in B il browser ti permetterà di continuare ad inviare richieste, ma dato che hai cambiato anche il suo dominio, e ora A e B hanno lo stesso dominio possono comunicare tra loro.
è importante prima effettuare almeno una richiesta in B al suo dominio originale, prima di cambiare il dominio. inoltre, non funzionerà se entrambe le pagine non sono servite dallo stesso host, quindi nella maggior parte dei casi non risolve il problema, ma ti dà un po 'più spazio di manovra.
ho usato questo trucco più di una volta e non ho riscontrato alcun problema, per quanto ne so, funziona su tutti i browser, fammi sapere se non lo fa in alcuni casi.
Ecco un esempio di pseudo:
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);
}
Questo suona come un bug o un exploit. In quali browser hai provato questo? – Halcyon
Funziona in IE, Chrome. Non ho eseguito il test in firefox – emphaticsunshine
Non sono sicuro di 'window.location.host', ma la modifica di' document.domain' consente a due diversi sottodomini sullo stesso dominio padre di comunicare. https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript – djd