Как получить высоту перекрестного домена 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>