2010-02-02 18 views
10

que estoy tratando de hacer algo similar a la aplicación de las podadoras aquí http://www.polyvore.com/cgi/clipperCerrar iframe dominios

puedo hacer que el marco flotante aparece en otro sitio web (dominios). Pero no puedo hacer que el botón "cerrar" funcione.

Esto es lo que he usado, pero no funciona para varios dominios (básicamente elimino el elemento iframe)

window.parent.document.getElementById('someId').parentNode.removeChild(window.parent.document.getElementById('someId'));  

puede ayudar? Gracias.

Respuesta

19

Debe usar una biblioteca que abstraiga esto (por ejemplo, http://easyxdm.net/wp/, no probado). La mensajería Fragment ID puede no funcionar en todos los navegadores, y hay mejores enfoques, como postMessage.

Sin embargo, su ejemplo (Clipper) está utilizando un truco llamado fragment id messaging. Esto puede ser un navegador cruzado, siempre que la página que contiene tu iframe sea el nivel superior. En otras palabras, hay un total de dos niveles. Básicamente, el niño establece el fragmento del padre y el padre observa esto.

Este es un enfoque similar a Clipper de:

Parent.html

<html> 
<head> 
<script type="text/javascript"> 
function checkForClose() 
{ 
    if(window.location.hash == "#close_child") 
    { 
     var someIframe = document.getElementById("someId"); 
     someIframe.parentNode.removeChild(someIframe); 
    } 
    else 
    { 
     setTimeout(checkForClose, 1000) 
    } 
} 
setTimeout(checkForClose, 1000); 
</script> 
</head> 
<body> 
<iframe name="someId" id="someId" src="child.html" height="800" width="600">foo</iframe> 
</body> 
</html> 

child.html:

<html> 
<head> 
<script type="text/javascript"> 
setTimeout(function(){window.parent.location.hash = "close_child";}, 5000); 
</script> 
<body style="background-color: blue"></body> 
</html> 

Edit2: Cross-dominio y controlado de forma independiente son diferentes. Indagué en el código de Polyvore (fuertemente minimizado/oscurecido) para ver cómo funciona (por cierto, no lo hace en Firefox). Primero recuerde que los bookmarklets, como Clipper, viven en el contexto de la página abierta cuando comienzan. En este caso, las cargas bookmarklet a script, que a su vez ejecuta una función init que genera an iframe, pero también se ejecuta:

Event.addListener(Event.XFRAME, "done", cancel); 

Si digg en addListener, encontrará (beautified):

if (_1ce2 == Event.XFRAME) { 
         if (!_1cb3) { 
          _1cb3 = new Monitor(function() { 
           return window.location.hash; 
          }, 
          100); 
          Event.addListener(_1cb3, "change", onHashChange); 
         } 
        } 

cancelar incluye:

removeNode(iframe); 

Ahora, la pieza única que queda es que las cargas iframe pageanother script con una función ClipperForm.init que incluye:

Event.addListener($("close"), "click", function() { 
      Event.postMessage(window.parent, _228d, "done"); 
     }); 

Así vemos claramente que están utilizando la mensajería ID fragmento.

+0

esto es demasiado complicado por encima de lo que necesito. Solo necesito cerrar el iframe. ¿Alguna forma sencilla de hacerlo? Si no, ¿puedes mostrar un ejemplo de cómo lo hace?Gracias –

+0

No tengo control sobre el documento principal. Es por eso que dije "dominio cruzado". Al igual que el ejemplo de Polyvore, tampoco controlan a los padres, pero aún pueden cerrar el iframe. ¡Extraño! –

+0

Como acabo de explicar más arriba, ellos/do/control el padre, y ellos/son/usan fragmentos de mensajes ID. –

1

Intente ocultar el contenido del iframe y no se preocupe por deshacerse realmente del elemento iframe en el elemento primario.

+0

¿Cómo esconderte? Obtuve este error Permiso denegado para para obtener la propiedad Window.document from . Así que, básicamente, no puedo encontrar una manera de hacer nada con el iframe –

+0

Supongo que si configura document.style.visibility = none (o como quiera que pueda ocultar todos los contenidos del iframe) en las cosas dentro del iframe, aún así termina con un gran cuadrado blanco? En ese caso, probablemente necesites un mecanismo de comunicación de fotogramas cruzados como sugiere Matthew Flaschen. Al mismo tiempo que inyecta el propio iframe, también inyecta el script para manejar un lado de la comunicación; y la página cargada dentro del iframe tiene la secuencia de comandos para manejar el otro lado. – Bruce

+0

Probar mostrar: ninguno –

Cuestiones relacionadas