2010-03-02 21 views
12

Tengo una página con un gran iframe que contiene la mayoría del contenido. El usuario interactúa con el sitio web al hacer clic dentro del marco flotante. La funcionalidad que intento construir es: cuando un usuario navega fuera de mi sitio, les hago un favor y me retiro del iframe.Detectar cuando el iframe tiene dominio cruzado, luego reventarlo

El iframe tiene un evento de carga que se activa cada vez que se carga una nueva página, entre dominios o no.

<iframe id="testframe" src="http://mysite.com" onload="testframe_loaded()"></iframe> 

Cada vez que el evento se dispara, estoy buscando alguna manera de:

Un) detectar cuando el usuario navega a un dominio diferente

B) Busto a cabo del iframe

Sospecho que B no es posible, ya que los navegadores no dan acceso a

document.getElementById("testframe").contentDocument.location.href 

cuando el iframe es multi-dominio. Tampoco estoy seguro de si A es posible.

Si alguien tiene ideas sobre cómo lograr esto, o si está seguro de que no se puede hacer, agradecería el consejo.

Gracias

Respuesta

7

Puede hacer A, ya que si se obtiene un error de seguridad (que se puede coger), eso es significa que están entre dominios :) A continuación, puede cambiar el tamaño del marco flotante a ser toda la página. Pero creo que tienes razón, en realidad no puedes estallar, sin la cooperación explícita del otro dominio.

EDITAR: Tiene razón, no necesita sondear. Aquí está el código básico:

<html> 
<head> 
<title>Cross-domain frame test</title> 
<!-- http://stackoverflow.com/questions/2365822/detect-when-iframe-is-cross-domain-then-bust-out-of-it/2365853#2365853 --> 
<script type="text/javascript"> 
function checkForCross() 
{ 
    var iframe = document.getElementById("myFrame"); 
    try 
    { 
    var loc = iframe.contentDocument.location.href; 
    } catch(e) 
    { 
    iframe.setAttribute("style", "border: 0; margin: 0; padding: 0; height: 100%; width: 100%;"); 
    } 
} 
</script> 
</head> 
<body> 
<iframe name="myFrame" id="myFrame" src="child.html" style="height: 50%; width: 50%;" onload="checkForCross()"></iframe> 
</body> 
</html> 
+1

Voy a probar el enfoque try/catch .. Siempre olvido que JavaScript admite eso :) Sin embargo, no es necesario el sondeo, ya que puedo probarlo cada vez que se activa el evento de carga del iframe. – Emmett

+0

Esto definitivamente funciona y demuestra que A es posible. Desafortunadamente, B aún parece imposible: la expansión del iframe funciona, pero todavía no funciona porque la URL en la barra de ubicación del navegador no coincidirá con el sitio que se muestra. Trataré de jugar un poco con las soluciones que implican modificar los enlaces que sugieren las otras respuestas, p. adjuntando un manejador de clics a cada enlace que verifica si el atributo href es de dominio cruzado. – Emmett

+0

Emmett, el manejador de clics funciona, pero solo para/your/links, no enlaces dentro del iframe. –

2

establece el atributo 'objetivo' en los enlaces externos a '_top'.

+0

Lo que puede hacer cuando no se cruza el dominio al recorrer la lista de materiales. – Joshua

1

Esto funciona para el cromo al menos (no el probador en otros navegadores)

if(parent.location.host != undefined){ 
     alert("hello world!"); 
    }else{ 
     throw "cannot access parent!"; 
    } 

Todavía va a tirar de la advertencia "unsafe javascript attempt", pero esto no impide la ejecución de código. En cambio, la variable se devuelve como indefinida.

Cuestiones relacionadas