Ответ 1
Вам следует использовать библиотеку, которая абстрагирует это (например, http://easyxdm.net/wp/, а не проверено). Обмен сообщениями с фрагментами может не работать во всех браузерах, и есть более эффективные подходы, такие как postMessage.
Однако ваш пример (Clipper) использует взломанный фрагмент id сообщений. Это может быть кросс-браузер, если страница, содержащая ваш iframe, является верхним уровнем. Другими словами, существует всего два уровня. В принципе, ребенок устанавливает фрагмент родителя, и родительский наблюдает за этим.
Это аналогичный подход к Clipper's:
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: Междоменное и независимое управление различаются. Я ворвался в (сильно укоренившийся/обфусканный) код Polyvore, чтобы посмотреть, как он работает (кстати, это не в Firefox). Прежде всего помните, что букмарклеты, такие как Clipper, живут в контексте открытой страницы, когда они начинаются. В этом случае букмарклет загружает a script, который, в свою очередь, запускает функцию init, которая генерирует iframe, но также выполняется:
Event.addListener(Event.XFRAME, "done", cancel);
Если вы вставляете в addListener, вы найдете (украшен):
if (_1ce2 == Event.XFRAME) {
if (!_1cb3) {
_1cb3 = new Monitor(function () {
return window.location.hash;
},
100);
Event.addListener(_1cb3, "change", onHashChange);
}
}
Отмена включает:
removeNode(iframe);
Теперь единственная оставшаяся часть состоит в том, что страница загружает еще один script с функцией ClipperForm.init, которая включает в себя:
Event.addListener($("close"), "click", function () {
Event.postMessage(window.parent, _228d, "done");
});
Итак, мы ясно видим, что они используют обмен фрагментами идентификаторов.