Как получить высоту перекрестного домена iframe
У меня есть iframe (кросс-домен) с src из facebook, twitter или etc. Мне нужно получить высоту iframe, но у меня есть проблема:"разрешение отказано в доступе к свойству "документ"". Пожалуйста, помогите мне решить эту проблему. Большое спасибо!
2 ответов
пару вопросов. Во-первых, высота iframe
скорее всего, не то, что вы хотите. Я имею в виду, что это явно задано в HTML-коде страницы, которую вы контролируете, и легко доступно и изменяемо с помощью любых средств Javascript. То, что кажется вам после, - это высота страницы внутри iframe. Если это так, простой ответ: вы не можете, по крайней мере, не с внешними службами, такими как Facebook/Twitter.
из-за соображений безопасности, можно легко пройти сообщения от ребенка к родителю, но не от родителя к ребенку, если только путь связи не был встроен в ваш javascript в обоих документах. Есть postMessage
протокол для работы в современных браузерах. https://developer.mozilla.org/en/DOM/window.postMessage . Но в этом случае это совершенно бесполезно, если документ, с которым вы общаетесь, не настроен на обработку входящего почтового сообщения, которое, насколько мне известно, Twitter/Facebook часто не.
Если Родительский документ может свободно общаться с детьми из разных доменов, то любой javascript может эффективно выполнять любую серию команд на любом сайте, на котором вы вошли в систему. Последствия этого для безопасности пугающие и, к счастью, невозможные.
в javascript нет опций для поиска высоты междоменной высоты iframe, но вы можете сделать что-то подобное с помощью некоторого программирования на стороне сервера. Я использовал PHP для этого примера
<?php
$output = file_get_contents('http://yourdomain.com');
?>
<div id='iframediv'>
<?php echo $output; ?>
</div>
<iframe style='display:none' id='iframe' src="http://yourdomain.com" width="100%" marginwidth="0" height="100%" marginheight="0" align="top" scrolling="auto" frameborder="0" hspace="0" vspace="0"> </iframe>
<script>
if(window.attachEvent) {
window.attachEvent('onload', iframeResizer);
} else {
if(window.onload) {
var curronload = window.onload;
var newonload = function(evt) {
curronload(evt);
iframeResizer(evt);
};
window.onload = newonload;
} else {
window.onload = iframeResizer;
}
}
function iframeResizer(){
var result = document.getElementById("iframediv").offsetHeight;
document.getElementById("iframe").style.height = result;
document.getElementById("iframediv").style.display = 'none';
document.getElementById("iframe").style.display = 'inline';
}
</script>