跨域iframe通信

时间:2009-12-22 22:59:48

标签: javascript iframe cross-domain

我在页面上创建了iframe,并且页面的域名被明确设置为“xyz.com”,但iframe的域名默认为“dev.xyz.com”,这是我真正的域名发展为。

问题是,当我尝试通过iframe.contentWindow.document访问iframe时,由于域名不同而失败。

我已经尝试将iframe的src设置为带有document.domain ='xyz.com'的文件,但这似乎没有做到这一点......

有什么想法吗?

3 个答案:

答案 0 :(得分:11)

iframe中的网页:

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

看起来很傻,但它确实有效。请参阅“What does document.domain = document.domain do?”。

答案 1 :(得分:8)

经过一些研究,我发现这个jQuery plugin使得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
    );

});

我在XP和W7上的Chrome 13 +,Firefox 3.6 +,IE7,8和9上进行了测试,在OSX和W7上进行了测试。 ;)

答案 2 :(得分:0)

作为对Ben Alman的参考的补充  插上我以为我会发布这个工作示例。它是一个iframe的rRelies,它有一个包含jquery身份验证的源页面&amp;数据查询脚本,然后使用消息插件将结果传递给{other domain}父窗口。

如果使用JQ v9,NB消息插件将中断,因为JQV9不使用插件中引用的“浏览器”

第一步: 将插件代码添加到发送和接收文档:

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

第二步: 将其添加到发送文档:

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

其中X可以是包含预先格式化的json数组或其他内容的本地var,这里的http url是接收文档的地址。

第3步: 将此添加到接收文档:

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

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

);

http url是发送文档的DOMAIN。 擅长IE 8,9,FF16,safari Windows(windows等x V9尚未测试),safari x mac thing。

结果是您想要从另一个域页(您有权访问..)的任何项目。