2009-05-29 19 views
47

Ho un'applicazione che ha una certa pagina - chiamiamola Pagina A. Pagina A è a volte una pagina di primo livello, ma a volte è anche incorporata come un iframe nella pagina B. Tutte le pagine vengono dallo stesso server e non ci sono problemi tra domini.Rileva iFrame incorporando in Javascript

Ho uno script greasemonkey eseguito a pagina A. Come può lo script greasemonkey rilevare se la pagina A è all'interno del contesto iframe o no?

+0

Vorresti solo cercare i genitori per i frame e vedere se esistono? – 76mel

+0

Possibile duplicato di [Come identificare se una pagina web viene caricata all'interno di un iframe o direttamente nella finestra del browser?] (Http://stackoverflow.com/questions/326069/how-to-identify-if-a-webpage- è-essere-caricato-dentro-un-iframe-o-direttamente-in-t) – feeela

risposta

111

L'analisi della lunghezza del frame si interrompe in generale se la pagina A ha frame (so che potrebbe non essere il caso per questa istanza specifica). Il test più affidabile e significativo sarebbe:

if (window!=window.top) { /* I'm in a frame! */ } 
+0

Puoi spiegare? Questo perché a.parent può essere uguale a? – Cheekysoft

+5

sì, esattamente così - .top e .parent possono puntare allo stesso oggetto di .self (e infatti sarebbe più chiaro testare window.self! = Window.top) – annakata

+0

Questo non ha funzionato per me all'interno di un Estensione di Firefox, ma ho trovato una soluzione diversa: http://stackoverflow.com/questions/326069#7769187 – magnoz

11

Il predicato

(window.parent.frames.length > 0) 

vi dirà solo quello che vuoi.

+0

che bel sito! +1 per quello – 76mel

+1

Basta non dimenticare di farlo dopo; 0) –

+3

Questo approccio ti dà un falso positivo se nidifichi un altro iframe nella pagina in cui esegui questo controllo. –

0

Usa window.frameElement e verificare se non è nullo e se il suo nodeName è "IFRAME".

+1

Questo elemento non è disponibile in Safari o Opera. Dato il numero di persone che navigano su iPad in questi giorni, questa probabilmente non è una soluzione adeguata. – Ash

4

Come indicato sopra, la soluzione accettata non funziona in IE8. Inoltre, il controllo di window.parent.frames.length può causare un'eccezione tra domini.

Invece sono riuscito a ottenere questo con var isInIFrame = top.location != self.location - funziona in IE8 e non causa una violazione tra domini purché non tenti di leggere il contenuto di top.location.