2011-07-19 34 views
33

¿Cómo uso javascript o jQuery para cerrar un iframe dentro del mismo iframe? Lo intenté <a href="javascript:self.close()"> pero no funcionó.Cómo cerrar un iframe dentro del propio iframe

+0

Si no quiere depender de los identificadores de tratar mi respuesta a http://stackoverflow.com/questions/6086986/how-do-i-remove-an-iframe-from -with-itself-that-has-been-been-been-dynamically-created – Rhys

Respuesta

58

"Cerrar" el iFrame actual no es posible, pero puede decirle al padre que manipule el dom y lo haga invisible.

En IFrame:

parent.closeIFrame(); 

En matriz:

function closeIFrame(){ 
    $('#youriframeid').remove(); 
} 
+0

@citizen, si no tengo control para el dominio principal. ¿Se puede manejar esto en el propio iframe? Al igual que en iframe, haciendo referencia al propio iframe mediante parent.getElementByID ("iFrameID"). Remove(); – Stan

+9

oh es de dominio cruzado? no podrás manipular la dom sin entrar en un nuevo mundo de dolor. –

+0

objeto principal es bastante eficiente ... Creo que así es como un iframe relaciona su página parental? – efirat

11
function closeWin() // Tested Code 
{ 
var someIframe = window.parent.document.getElementById('iframe_callback'); 
someIframe.parentNode.removeChild(window.parent.document.getElementById('iframe_callback')); 
} 


<input class = question name="Close" type ="button" value = "Close" onClick = "closeWin()"  tabindex="10" /> 
+1

Esto no funciona! Implementado en unos segundos. ¡Lo recomiendo! – Laci

+1

Esto funciona, pero no dominio cruzado :( –

+0

Años tarde, lo sé, pero solo quiero señalar que innecesariamente llamas a getElementById dos veces. La segunda línea de 'closeWin()' debería ser 'someframe.parentNode. removeChild (someIframe); '. – Doin

2

Utilice esta opción para eliminar iframe del padre dentro de marco flotante en sí

frameElement.parentNode.removeChild(frameElement) 

Se trabaja con un mismo origen solamente (no permitido con cruz ori ginebra)

1

su tipo de hacky pero funciona bien-ish

function close_frame(){ 
    if(!window.should_close){ 
     window.should_close=1; 
    }else if(window.should_close==1){ 
     location.reload(); 
     //or iframe hide or whatever 
    } 
} 

<iframe src="iframe_index.php" onload="close_frame()"></iframe> 

continuación, dentro del marco

$('#close_modal_main').click(function(){ 
     window.location = 'iframe_index.php?close=1'; 
}); 

y si usted desea conseguir la suposición a través de un

if(isset($_GET['close'])){ 
    die; 
} 

en la parte superior de la página de tu marco para que la recarga no se note

así que básicamente la primera vez que se carga de marco es imposible ocultarse pero la próxima vez que se carga el itll llamar a la función onload y el padre tendrá una la ventana var haciendo que el marco para cerrar

1

Ninguno de esta solución trabajó para ya que estoy en un escenario de dominio cruzado creando un bookmarklet como Pin It de Pinterest.

He encontrado una plantilla bookmarklet en GitHub https://gist.github.com/kn0ll/1020251 que resolvió el problema de cerrar el Iframe enviando el comando desde allí.

Ya que no puedo acceder a cualquier elemento de la ventana padre dentro del marco flotante, esta comunicación sólo se puede realizar la publicación de eventos entre las dos ventanas utilizando window.postMessage

Todos estos pasos son en el enlace de GitHub:

1- Debes insertar un archivo JS en la página principal.

2- En este archivo se inyecta en la matriz, añadir un evento listner ventana

window.addEventListener('message', function(e) { 
     var someIframe = window.parent.document.getElementById('iframeid'); 
     someIframe.parentNode.removeChild(window.parent.document.getElementById('iframeid')); 
    }); 

Este oyente se encargará del cierre y cualquier otro evento que desea

3- Dentro de la página de marco flotante que envíe la orden de cierre a través de postMessage:

$(this).trigger('post-message', [{ 
        event: 'unload-bookmarklet' 
       }]); 

Siga la plantilla en https://gist.github.com/kn0ll/1020251 y usted estará bien!

creo que sirve,

+0

La segunda línea de su función de oyente par (paso 2) innecesariamente llama a getElementById por segunda vez con el mismo argumento que antes. Esta línea debería ser simplemente:' someIframe.parentNode.removeChild (someIframe); ' – Doin

+0

Además, creo que hay un error en su código. Si el detector de eventos se inyecta y se ejecuta en el contexto de la ventana principal, entonces no debe escribir' window.parent.document.getElementById (...) 'pero simplemente' document.getElementById (...) ', porque ya está * en * la ventana principal. – Doin