Междоменная связь через фрейм - PullRequest
15 голосов
/ 23 декабря 2009

У меня есть iframe, созданный на странице, и домену страницы явно задано значение «xyz.com», но доменом iframe по умолчанию является «dev.xyz.com», который является фактическим доменом, которым я являюсь развивается для.

Проблема в том, что при попытке доступа к этому iframe через iframe.contentWindow.document происходит сбой из-за разницы в домене.

Я пытался установить src для iframe в файл с document.domain = 'xyz.com', но это не помогло ...

Есть идеи?

Ответы [ 3 ]

11 голосов
/ 23 декабря 2009

Страница внутри iframe:

<script>
document.domain = document.domain;
</script>

Это выглядит глупо, но это работает. Смотрите " Что делает document.domain = document.domain? ".

8 голосов
/ 01 декабря 2011

После некоторых исследований я обнаружил этот плагин jQuery , который делает postMessage обратно совместимым со старыми браузерами с использованием различных приемов.

Вот быстрый пример, показывающий, как отправить высоту тела iframe в родительское окно:

На странице хоста (родительской):

    // executes when a message is received from the iframe, to adjust 
    // the iframe's height
    $.receiveMessage(
        function( event ){
            $( 'my_iframe' ).css({
                height: event.data
            });
    });
   // Please note this function could also verify event.origin and other security-related checks.

На странице iframe:

$(function(){

    // Sends a message to the parent window to tell it the height of the 
    // iframe's body        
    var target = parent.postMessage ? parent : (parent.document.postMessage ? parent.document : undefined);

    $.postMessage(
        $('body').outerHeight( true ) + 'px',
        '*',
        target
    );

});

Я проверял это на Chrome 13+, Firefox 3.6+, IE7, 8 и 9 на XP и W7, сафари на OSX и W7. ;)

0 голосов
/ 08 марта 2013

Как дополнение к ссылке на Бена Алмана подключи я думал выложу этот рабочий пример. Он] rRelies на iframe, который имеет исходную страницу, содержащую скрипт аутентификации jquery и запроса данных, который затем передает результат в родительское окно {Другой домен} с помощью плагина сообщений.

Плагин NB-сообщений прервется, если использовать JQ v9, поскольку JQV9 не использует «браузер», указанный в плагине

1-й шаг: Добавьте код плагина к отправляющей и получающей документам:

http://benalman.com/projects/jquery-postmessage-plugin/

2-й шаг: Добавьте это к отправке документа:

   $.postMessage(
$(X).html(),    
'http://DOMAIN [PORT]/FOLDER/SUBFOLDER/RECIEVINGDOCNAME.XXX'   
 )  ;      

Где X может быть локальной переменной, содержащей предварительно отформатированный массив json или другой материал, а http-адрес здесь - это адрес принимающего документа.

3-й шаг: Добавьте это к получению документа:

    $.receiveMessage(
    function(event){
        alert("event.data: "+event.data);
                $("#testresults").append('<h1>'+event.data+'<h1>');

    },          
    'http://DOMAIN.COM OR SOMETHING'

);

Где http url - ДОМЕН отправляющего документа. Хорошо в IE 8, 9, FF16, Windows Safari (Windows ждет x V9 еще не тестировался), Safari x Mac вещь.

Результатом является любой элемент, который вы хотите получить с другой страницы домена (к которому у вас есть доступ ..).

...