Вы должны использовать библиотеку, которая абстрагирует это (например, , не проверено). Обмен сообщениями с фрагментами может не работать во всех браузерах, и есть более эффективные подходы, такие как postMessage.
Однако, ваш пример (Clipper) использует взломанный номер fragment id messaging. Это может быть кросс-браузер, если страница, содержащая ваш iframe, является верхним уровнем. Другими словами, существует всего два уровня. В принципе, ребенок устанавливает фрагмент родителя, и родительский наблюдает за этим.
Это подобный подход к Машинка'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, который, в свою очередь, запускает функцию инициализации, которая генерирует an iframe, но также работает:
Event.addListener(Event.XFRAME, "done", cancel);
Если вы DIGG в AddListener, вы найдете (beautified):
if (_1ce2 == Event.XFRAME) {
if (!_1cb3) {
_1cb3 = new Monitor(function() {
return window.location.hash;
},
100);
Event.addListener(_1cb3, "change", onHashChange);
}
}
отменить включает в себя:
removeNode(iframe);
Теперь, единственный оставшийся кусок, что iframe page нагрузки another script с функцией ClipperForm.init, которая включает в себя:
Event.addListener($("close"), "click", function() {
Event.postMessage(window.parent, _228d, "done");
});
Итак, мы ясно видим, что они используют фрагмент ID сообщений.
Это слишком сложно выше, что мне нужно. Мне нужно только закрыть iframe. Любой простой способ сделать это? Если нет, можете ли вы показать пример, как это делается?Спасибо –
Хотя у меня нет контроля над родительским документом. Вот почему я сказал «кросс-домен». Подобно примеру Polyvore, они не контролируют родителя, но они все равно могут закрыть iframe. Странный! –
Как я только что объяснил выше, они/do/управляют родителем, и они/есть/используют обмен фрагментами ID. –