2009-07-21 7 views
10

Ecco il caso:
pagina A contiene iframe B, B contiene iframe C, A e B sono sotto lo stesso dominio, C sotto un altro.
C tenta di ripristinare la posizione del genitore B con informazioni aggiuntive che seguono "#" per risolvere le comunicazioni tra domini tramite Fragment Id Messaging.

IE6/7/8 funziona correttamente con questo caso, mentre Firefox blocca l'ubicazione parent.location con il messaggio di errore [Accesso alla proprietà negata ": 1010]. Ma se B è la finestra in alto, il che significa che non c'è A, anche Firefox vive.

È strano per me ... Potresti aiutarmi per favore?

Grazie!Impostazione posizione genitore JavaScript di dominio incrociato errore firefox

risposta

15

Storicamente, qualsiasi finestra potrebbe cambiare la posizione di qualsiasi altra finestra. Questo risultò essere un problema perché, tra le altre cose, significava incorporare un iframe di accesso in una finestra non sicuro (perché un sito dannoso poteva sostituire l'iframe di accesso con una versione falsificata). Nel corso del tempo sono state applicate ulteriori limitazioni alle modifiche della posizione alle finestre del browser, fino a ora, quando HTML5 e la maggior parte dei browser hanno raggiunto un accordo comune su the ancestor policy. In poche parole, parafrasando le specifiche HTML5, una finestra A può modificare la posizione di un altro se e solo se finestra B:

  • le posizioni di A e B hanno la stessa origine, vale a dire che hanno lo stesso schema, ospite e porta (http, stackoverflow.com, 80 per esempio) o
  • B è una finestra di livello superiore e A è una finestra in un frame annidato a una certa profondità all'interno di B (figlio diretto, figlio di un bambino, ecc.), oppure
  • B è una finestra aperta utilizzando window.open e A può cambiare la posizione della finestra che ha aperto B (quindi B è un popup aperto da A, da una finestra popup aperta da A, oa maggiore profondità) oppure
  • B non è una finestra di primo livello, ma la sua finestra padre, o la sua finestra padre del genitore, o in qualche simile quantità di parentela le posizioni di quella finestra e A sono same-origin

(stessa origine è più complicato di questo, ma la descrizione incorporata sopra coglie la sua essenza e copre i casi più comuni.)

Secondo questa politica, C può cambiare la posizione di A, e A può cambiare la posizione di B o C, ma C potrebbe non cambiare la posizione di B. Se hai bisogno di aggirare questo, allora dovresti cambiare la posizione della tua A in qualcosa che cambi B in modo appropriato; alternativamente, è possibile ask your page B to change its own location.

Speriamo che sia informativo, se non necessariamente utile. Il modello di sicurezza del browser non era tanto progettato come evoluto, e solo con il recente lavoro in HTML5 è davvero stato accuratamente inchiodato per affrontare queste incongruenze tra i browser.

Detto questo, sono sorpreso che IE7 e IE8 funzionino per voi: ho capito che la politica precedente era basata principalmente sulla politica implementata da IE7.

+0

grazie per la tua risposta chiara e bella, riconsidererò la mia soluzione su questo. –

+0

Grazie Jeff. Va notato che window.postMessage a cui si fa il collegamento funziona in tutti i browser moderni, ma la sintassi in IE è leggermente diversa. Ho postato una domanda simile a questa e ho finito per rispondere a me stesso. Ecco la mia risposta che ha una semplice implementazione di esempio cross-browser: http://stackoverflow.com/questions/1860470/is-there-any-way-for-an-iframe-to-change-the-top-windows- url/1861054 # 1861054 – Kip

0

Da C è possibile accedere alla finestra di B utilizzando window.top.

prova, var B = window.top; B.location = "...";

+0

se si utilizza window.top da C, ho ottenuto A piuttosto che B, ma non voglio reimpostare la posizione di A ... –

Problemi correlati