È necessario utilizzare una libreria che astrae questo (ad esempio http://easyxdm.net/wp/, non testato). La messaggistica con ID frammento potrebbe non funzionare in tutti i browser e ci sono approcci migliori, come ad esempio postMessage.
Tuttavia, il tuo esempio (Clipper) utilizza un hack chiamato fragment id messaging. Questo può essere cross-browser, a condizione che la pagina contenente l'iframe sia il livello più alto. In altre parole, ci sono due livelli in totale. Fondamentalmente, il bambino imposta il frammento del genitore, e il genitore guarda per questo.
Si tratta di un approccio simile a Clipper di:
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: tra domini e controllato in modo indipendente sono diversi. Ho scavato nel codice Polyvore (molto miniato/offuscato) per vedere come funziona (incidentalmente, non in Firefox). Per prima cosa ricorda che i bookmarklets, come il Clipper, si aprono nel contesto della pagina aperta all'avvio. In questo caso, i carichi bookmarklet a script, che a sua volta esegue una funzione di init che genera an iframe, ma anche corre:
Event.addListener(Event.XFRAME, "done", cancel);
Se digg in addListener, troverete (beautified):
if (_1ce2 == Event.XFRAME) {
if (!_1cb3) {
_1cb3 = new Monitor(function() {
return window.location.hash;
},
100);
Event.addListener(_1cb3, "change", onHashChange);
}
}
annullare include:
removeNode(iframe);
Ora, il pezzo unico rimasto è che il iframe page carichi another script con una funzione ClipperForm.init che comprende:
Event.addListener($("close"), "click", function() {
Event.postMessage(window.parent, _228d, "done");
});
Così si vede chiaramente che stanno utilizzando la messaggistica frammento ID.
questo è troppo complicato sopra quello che mi serve. Ho solo bisogno di chiudere gli iframe. Qualche modo semplice per farlo? In caso contrario, puoi mostrare un esempio di come questo lo fa?Grazie –
Non ho il controllo sul documento principale però. Ecco perché ho dichiarato "cross domain". Proprio come l'esempio di Polyvore, non controllano anche il genitore, ma possono comunque chiudere l'iframe. Strano! –
Come ho appena spiegato sopra, essi/fanno/controllano il genitore, e sono/stanno/utilizzando la messaggistica ID dei frammenti. –