2012-03-27 23 views
5

Javascript:Detección isInIframe en Javascript

inFrame = true; 
try { 
    if(window.top == self) { 
     inFrame = false; 
    } 
} catch (err){} 

try { 
    if(window.parent.location == self.location){ 
     inFrame = false;  
    } 
} catch (err){} 

Esta es una pieza de código JavaScript que utilizo para detectar si mi biblioteca está dentro de un iframe. 1 de cada 100% de las solicitudes informan que mi biblioteca está dentro de un iframe, lo que creo que no es posible.

¿Existe la posibilidad de que este código falle [informe verdadero en falso o viceversa]?

De registro de acceso [I registrar cada tipo de peticiones iframe]

  1. encontré que ocurre en todos los navegadores modernos [es decir, 6-9, cromo, FF, Safari] de cadena de agente de usuario.
  2. No pude encontrarle ningún sentido a la referencia porque son lo mismo que mi sitio editorial.
  3. En algunos casos encontré para la misma referencia, la misma URL solicitó & mismo cliente ip mi biblioteca había estado una vez dentro de un iframe & no en otro. Esto me hizo dudar del código anterior.

Habrá alguna diferencia al window o document se carga en las propiedades [self, location, top, parent] que utilizo para comprobar? Debido a que mi secuencia de comandos se carga y se ejecuta sincrónicamente en su mayoría antes de que el documento esté listo o la ventana esté completamente cargada y eso hace que la prueba de iniframe continúe.

Respuesta

0

Usted sabe navegadores más modernos permiten "Ver Cuadro" ¿verdad? Como en, ver el contenido del marco sin el padre. Esa es una respuesta completamente plausible para 3. (Lo hago todo el tiempo).

Una causa plausible de 1 y 2 es que self no está realmente definido en javascript, por lo tanto, puede no ser siempre igual a window. Por lo tanto, debe comprobar window o mejor aún window.self no self como Özgür sugiere.

+0

Voy a intentar con la ventana y actualizar el estado – Tamil

1

así es como me sale el resultado es en el marco y que funciona para mí inFrame = window.top != window

0

Si todo lo que estamos tratando de hacer es detectar cuando el código está en un marco de cualquier tipo, todo lo que necesita es la siguiente:

if (window.top !== window) { 
    // you are embedded in a frame 
} 

o para establecer la variable de inFrame así:

inFrame = (window.top !== window); 

o en función de la forma:

function isInFrame() { 
    return (window.top !== window); 
} 

mientras usted no está accediendo a las propiedades de la window.top objeto, no debería necesitar manejadores de excepción para protegerse de padres de dominios cruzados. En una situación de origen cruzado, puede acceder al window.top, pero no puede acceder a propiedades como window.top.location.href.

En cuanto a sus otras preguntas:

¿Existe la posibilidad de que este código falle [informe versa sobre la verdadera falsa o vice]?

La primera parte de su código se ve bien aunque no se requiere el manejador de excepciones. La segunda parte de su código arrojará una excepción cada vez en los navegadores modernos cuando la ventana y el marco principal son orígenes diferentes.

¿Habrá alguna diferencia, mientras que la ventana o el documento está siendo cargado en las propiedades [auto, la ubicación, la parte superior, los padres] que utilizo para comprobar? Porque mi secuencia de comandos se carga y se ejecuta sincrónicamente en su mayoría antes de que el documento esté listo o la ventana esté completamente cargada y eso hace que la prueba de iniframe continúe.

En el punto en que se está cargando la ventana, es seguro realizar esta comprobación. Ambos window y window.top serán válidos en ese punto, incluso si ninguno ha terminado de cargarse todavía. Por lo tanto, no debería haber ningún problema con la detección de InFrame que requiera que espere a que algo complete la carga.

Cuestiones relacionadas