`
bellstar
  • 浏览: 148474 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用 window.name 解决跨域问题

阅读更多
内容来源怿飞的BLOG
比较适合获取跨域的HTML片段,获取JSON可以用SCRIPT标签解决.

用自己的话描述一下实现跨域的过程:
在A域名下的某个网页下需要向另一个域名B(子域或不同域名)发起请求获取数据,首先创建一个IFRAME(SRC直接填写为要请求的URL)来载入跨域页面,同时监听该IFRAME的onload事件.IFRMAE载入的B域名页面通过JS把数据赋予window.name,完成赋值后通过更改自身的location跳转到A域名下的一个空白页面,此空白页面载入完成后,触发此次请求的回调并移除IFRAME,因为此时IFRAME和主页面同域(都是A域),所以可以获取到IFRAME的window.name中的数据.


下面的代码摘自原文:

window.name 的美妙之处:name 值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)


A域以下面的代码来发起请求和实现回调
(function(){
    var YUD = YAHOO.util.Dom, YUE = YAHOO.util.Event;

    dataRequest = {
        _doc: document,
        cfg: {
            proxyUrl: 'proxy.html'
        }
    };

    dataRequest.send = function(sUrl, fnCallBack){
        if(!sUrl || typeof sUrl !== 'string'){
            return;
        }

        sUrl += (sUrl.indexOf('?') > 0 ? '&' : '?') + 'windowname=true';

        var frame = this._doc.createElement('iframe'), state = 0, self = this;
        this._doc.body.appendChild(frame);
        frame.style.display = 'none';

        var clear = function(){
            try{
                frame.contentWindow.document.write('');
                frame.contentWindow.close();
                self._doc.body.removeChild(frame);
            }catch(e){}
        };

        var getData = function(){
            try{
                var da = frame.contentWindow.name;
            }catch(e){}
            clear();
            if(fnCallBack && typeof fnCallBack === 'function'){
                fnCallBack(da);
            }
        };

        YUE.on(frame, 'load', function(){
            if(state === 1){
                getData();
            } else if(state === 0){
                state = 1;
                frame.contentWindow.location = self.cfg.proxyUrl;
            }
        });

        frame.src = sUrl;
    };
})();


B域下的页面以这种形式绑定数据到window.name
<html>
    <body>
        <p id="content">
            some <strong>html/xml-style</strong>data
        </p>
    </body>
    <script type="text/javascript">
        window.name = document.getElementById("content").innerHTML;
    </script>
</html>


另外一个跨域的解决方案比较复杂,能实现同域下的子域与子域或者子域与父域的通信,但要求主页面必须是主域查看DEMO
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics