跨域访问的解决方式

即域名、协议、端口,三者中若有一个不相同,则会出现跨域问题。

--------------------------------------------------------------------------------

解决方法:

1、设置document.domain属性(适合同一主域下不同子域间的通信)

对于主域相同而子域不同的情况(上述表格6),可以通过修改document的domain属性来解决。由于同源策略认为域和子域隶属于不同的域,那么我们

无法在a.com/a.js中访问kpm.a.com/b.js。可以在a.js中设置document.domain=a.com,此时浏览器就会认为它们处于同一个域下,这样两个文件之

间就可以正常通信了。

2、window.name方式(适合单向的数据请求)

window.name属性是一个很特别的属性,当该window的location变化,然后重新加载,name属性可以依然保持不变。所以我们可以在页面 a.html中

用iframe加载b.html,在b.html中用JavaScript把需要传递的数据赋值给window.name,iframe加载完成之后,在a.html修改iframe的地址,将其变成

代理文件proxy.html(proxy.html与a.html在同一个域名下,可以通信),然后就可以读出window.name的值了。
function crossDomain() {
    var data = '';   

    var iframe = document.createElement('iframe');
    iframe.style.display = 'none';    

    document.body.appendChild(iframe);

    var _load = function() {
           try{
                   data = iframe.contentWindow.name;
            }catch(e) {
                    iframe.contentWindow.location= 'http://www.a.com/proxy.html';
            }
           if(iframe.attachEvent) { 

                    iframe.attachEvent('onload', _load);
            } else {
                    iframe.onload = _load;
            }
            iframe.src = 'http://www.b.com/b.html';

        //为不让其他域的js访问name,最后销毁iframe

            iframe.contentWindow.document.write('');
            iframe.contentWindow.close();
            document.body.removeChild(iframe);

        return data;

};

3、动态创建js(只能加载js文件)

script标签本身就可以访问其它域的资源,不受浏览器同源策略的限制,可以通过在页面动态创建script标签,代码如下: 

        var script = document.createElement('script');  
        script.src = "XXX";  
        document.body.appendChild(script);  

这样通过动态创建script标签就可以加载其它域的js文件,然后通过本页面就可以调用加载后js文件的函数。缺陷是不能加

载其它域的文档,只能是js文件。

4、使用HTML5的window.postMessage(很酷的新技术)

window.postMessage是HTML5定义的一个很新的方法,使用它可以很方便地进行跨文档消息传输Cross Document Messaging。

语法:

otherWindow.postMessage(message, targetOrigin);
· message:作为postMessage()第一个参数传入的字符串数据。
· targetOrigin:发送消息的文档所在的域,例如"http://www.a.com"

发送消息方:iframe.contentWindow.postMessage('Hello lynnelv');

消息接收方:

window.addEventListener("message", function(event) {  

        if (event.origin == "http://www.a.com"){     //确保发送消息的域是已知的域
                processMessage(event.data);    //处理接收到的数据

        }

});


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值