Междоменная iframe-связь

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

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

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

Любые идеи?

Ответ 2

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

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

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

    // executes when a message is received from the iframe, to adjust 
    // the iframe 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 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.;)

Ответ 3

В дополнение к ссылке на Бен Альман  plug in Я думал, что опубликую этот рабочий пример. Он] rRelies на iframe, который имеет исходную страницу, содержащую проверку подлинности jquery и запрос данных script, который затем передает результат в родительское окно {other domain} с помощью плагина сообщений.

Плагин сообщений NB будет нарушен, если использовать JQ v9, поскольку JQV9 не использует "браузер", указанный в плагине

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

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

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

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

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

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

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

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

);

Где URL-адрес http является DOMAIN отправляющего документа. Хорошо в IE 8, 9, FF16, сафари Windows (Windows wait x V9 еще не проверена), сафари x mac вещь.

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