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.
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 –
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! –
Como acabo de explicar más arriba, ellos/do/control el padre, y ellos/son/usan fragmentos de mensajes ID. –