2009-05-29 11 views
47

Tengo una aplicación que tiene una página determinada - llamémosla Página A. La página A es a veces una página de nivel superior, pero a veces también está incorporada como un iframe en la página B. Todas las páginas vienen desde el mismo servidor y no hay problemas entre dominios.Detectar la incrustación de iFrame en Javascript

Tengo un script de greasemonkey que se ejecuta en la página A. ¿Cómo puede el script greasemonkey detectar si la página A está dentro del contexto iframe o no?

+0

¿Debería buscar en el principal los marcos y ver si existen? – 76mel

+0

Posible duplicado de [¿Cómo identificar si una página web se está cargando dentro de un iframe o directamente en la ventana del navegador?] (Http://stackoverflow.com/questions/326069/how-to-identify-if-a-webpage- is-being-loaded-inside-an-iframe-or-directly-into-t) – feeela

Respuesta

111

En cuanto a la longitud del marco se rompe generalmente si la página A en sí tiene marcos (sé que podría no ser el caso para esta instancia específica). La prueba más fiable y significativa sería:

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

¿Puedes explicarlo? ¿Esto es porque a.parent puede ser igual a? – Cheekysoft

+5

sí, exactamente así - .top y .parent pueden señalar el mismo objeto que .self (y de hecho, posiblemente sería más claro probar window.self! = Window.top) – annakata

+0

Esto no funcionó para mí dentro de un Extensión de Firefox, pero encontré una solución diferente: http://stackoverflow.com/questions/326069#7769187 – magnoz

11

El predicado

(window.parent.frames.length > 0) 

le dirá exactamente lo que desea.

+0

¡qué sitio tan genial! +1 para eso – 76mel

+1

Simplemente no olvide hacerlo después de; 0) –

+3

Este enfoque le da falso positivo si anida otro iframe en la página donde ejecuta esta verificación. –

0

Uso window.frameElement y comprobar si no es nulo y si su nombreNodo es "IFRAME".

+1

Este elemento no está disponible en Safari u Opera. Dado el número de personas que navegan en iPads estos días, probablemente esta no sea una solución adecuada. – Ash

4

Como se indicó anteriormente, la solución aceptada no funciona en IE8. Además, marcar window.parent.frames.length puede causar una excepción entre dominios.

En su lugar, pude lograrlo con var isInIFrame = top.location != self.location - funciona en IE8 y no causa una violación entre dominios siempre que no intente leer el contenido de top.location.

Cuestiones relacionadas