`
bellstar
  • 浏览: 150627 次
  • 性别: 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
分享到:
评论

相关推荐

    window.name解决跨域问题的文档

    window.name 解决跨域问题的文档 window.name 传输技术是 Thomas Frank 发明的,旨在解决 cookie 的一些劣势,例如每个域名 4 x 20 Kb 的限制、数据只能是字符串、设置和获取 cookie 语法的复杂等等。后来,Kris ...

    javascript使用window.name解决跨域问题第1/2页

    后来 Kris Zyp 在此方法的基础上强化了 window.name 传输 ,并引入到了 Dojo (dojox.io.windowName),用来解决跨域数据传输问题。window.name 传输技术的基本原理和步骤为: name 在浏览器环境中是一个全局/window...

    跨域问题 之 window.name

    标题提到的“跨域问题之window.name”是指在处理跨域通信时,开发者利用`window.name`属性来传递数据的一种策略。这种技术主要应用于iframe之间的通信,因为浏览器的同源策略限制了不同源的页面直接交互,但`window....

    利用window.name跨域解决方案Demo.rar

    本Demo实现了一个来自不同服务器的前端页面集成方案,页面间通过window窗口关系形成父子页面关系,跨域情况下父子页面间彼此看不见对方的DOM和js对象,无法直接进行数据交互。本方案从父页面到子页面数据传递采用url...

    window.name解决跨域数据传输问题

    原文:http://research.microsoft.com/~helenw/papers/subspace.pdfwindow.name 传输技术,原本是 Thomas Frank 用于解决 cookie 的一些劣势(每个域名 4 x 20 Kb 的限制、数据只能是字符串、设置和获取 cookie 语法...

    javascript跨域总结之window.name实现的跨域数据传输

    总结而言,window.name是一个跨域数据传输的好方法,它利用了浏览器的特定机制,解决了在不同域之间传输大量数据的问题,而不会违反浏览器的同源策略。需要注意的是,在使用window.name传输数据后,应当及时销毁...

    完美解决iframe跨域问题

    **三、window.name跨域通信详解** 1. **原理**:`window.name`不受同源策略限制,可以在任何页面中读写,即使页面被刷新或导航至其他URL,`window.name`的值依然保留。因此,可以利用这一点在父页面和iframe之间...

    window.open打开新窗口参数设置

    1. **兼容性问题**:不同的浏览器对 `window.open()` 方法的支持程度不同,因此在使用时需要注意浏览器兼容性问题。 2. **弹窗阻止**:许多浏览器都具有弹出窗口阻止功能,这可能会影响 `window.open()` 方法的执行...

    javascript 打开页面window.location和window.open的区别.docx

    - **跨域限制**:使用 `window.location` 或 `window.open` 时需要注意同源策略,确保不会违反跨域限制。 #### 七、总结 综上所述,`window.location` 和 `window.open` 在JavaScript中都扮演着重要的角色,但在...

    js弹窗并返回值(window.open方式)

    1. 使用`window.open`打开的新窗口中设置一个`window.opener`属性,这样新窗口可以与打开它的窗口进行通信。 2. 在新窗口中处理用户交互后,使用`window.close`关闭窗口,并在关闭前将结果通过`window.opener`通知原...

    window.open父子窗口传值问题

    要解决父子窗口间的传值问题,有以下几种方法: 1. **使用URL参数**:在`window.open`的`url`中添加查询参数来传递数据。例如: ```javascript var url = "child.html?data=" + encodeURIComponent(value); var ...

    name-storage:通过 window.name 存储

    技术上,nameStorage 使用 window.name 存储数据。数据的生存周期为窗口会话的生存周期,同一个窗口可以通过 nameStorage 共享数据。出生证明window.name 非常有用,但不可滥用。为了规范、简单便利、安全的使用 ...

    windowName跨域详解.pdf

    通过proxy函数封装的window.name跨域技术,可以在a.html页面上访问到b.html页面的数据,即便它们运行在不同的域下。在该案例中,通过创建一个iframe来加载目标页面,并在加载完成后,将iframe重定向到同源页面,从而...

    什么是跨域解决方案有哪些.docx

    通过使用 window.name,可以实现跨域通信。 五、 postMessage 跨域 通过使用 postMessage,可以实现跨域通信。 六、 跨域资源共享(CORS) 通过设置 HTTP 头,可以实现跨域资源共享。 七、 nginx 代理跨域 ...

    iframe 跨域解决方法

    这篇博客将深入探讨如何解决`iframe`的跨域问题。 首先,理解同源策略是至关重要的。同源策略是浏览器为保障用户数据安全而设置的一种机制,它限制了来自不同源的文档或脚本之间的交互。对于`iframe`,如果源(协议...

    PHP下ajax跨域的解决方案之window.name实例分析

    总结起来,PHP下利用`window.name`解决AJAX跨域的问题,主要是通过在目标页面设置`window.name`,然后通过同源的代理页面读取这些数据。这种方式虽然相对简单,但并非适用于所有场景,因此在实际开发中,还需要根据...

    前端后端跨域问题

    ### 前端后端跨域问题解析及解决方案 #### 跨域问题概述 跨域问题,即Cross-Origin Resource Sharing(CORS),是指浏览器出于安全考虑,在不同源之间执行网络请求时实施的一种限制机制。根据同源策略的规定,只有...

    web跨域解决方案.docx

    Web 跨域解决方案 ...跨域问题的解决方案有很多,包括 JSONP、CORS 策略、document.domain + iframe 的设置、HTML5 的 postMessage、使用 window.name 来进行跨域等。理解跨域问题的原理和解决方案是非常重要的。

    iframe跨域解决方案

    综上所述,`iframe`跨域解决方案主要包括`postMessage`通信、`window.name`数据传递以及`CORS`策略。在实际应用中,开发者应根据具体需求和安全考虑,选择合适的跨域策略。同时,需要注意的是,虽然这些方法能突破...

Global site tag (gtag.js) - Google Analytics