window.name 传输技术,原本是 Thomas Frank 用于解决 cookie 的一些劣势(每个域名 4 x 20 Kb 的限制、数据只能是字符串、设置和获取 cookie 语法的复杂等等)而发明的(详细见原文:《Session variables without cookies》 ),后来 Kris Zyp 在此方法的基础上强化了 window.name 传输 ,并引入到了 Dojo (dojox.io.windowName ),用来解决跨域数据传输问题。
window.name 的美妙之处:name 值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。
window.name 传输技术的基本原理和步骤为:
name 在浏览器环境中是一个全局/window对象的属性,且当在 frame 中加载新页面时,name 的属性值依旧保持不变。通过在 iframe 中加载一个资源,该目标页面将设置 frame 的 name 属性。此 name 属性值可被获取到,以访问 Web 服务发送的信息。但 name 属性仅对相同域名的 frame 可访问。这意味着为了访问 name 属性,当远程 Web 服务页面被加载后,必须导航 frame 回到原始域。同源策略依旧防止其他 frame 访问 name 属性。一旦 name 属性获得,销毁 frame 。
在最顶层,name 属性是不安全的,对于所有后续页面,设置在 name 属性中的任何信息都是可获得的。然而 windowName 模块总是在一个 iframe 中加载资源,并且一旦获取到数据,或者当你在最顶层浏览了一个新页面,这个 iframe 将被销毁,所以其他页面永远访问不到 window.name 属性。
(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; }; })();
Web 服务器如何提供 window.name 数据
为了让 Web 服务器实现 window.name,服务器应该只寻找请求中是否包含 windowname 参数。如果包含了
windowname 参数,服务器应该返回一个设置了 window.name 字符串值的 HTML 文档,回应此请求并传送到客户端。例如:
http://www.planabc.net/getdata.html?windowname=true
如果服务器想用 Hello 响应客服端,它应该返回一个 HTML 页面:
相关推荐
window.name 解决跨域问题的文档 window.name 传输技术是 Thomas Frank 发明的,旨在解决 cookie 的一些劣势,例如每个域名 4 x 20 Kb 的限制、数据只能是字符串、设置和获取 cookie 语法的复杂等等。后来,Kris ...
总结而言,window.name是一个跨域数据传输的好方法,它利用了浏览器的特定机制,解决了在不同域之间传输大量数据的问题,而不会违反浏览器的同源策略。需要注意的是,在使用window.name传输数据后,应当及时销毁...
本Demo实现了一个来自不同服务器的前端页面集成方案,页面间通过window窗口关系形成父子页面关系,跨域情况下父子页面间彼此看不见对方的DOM和js对象,无法直接进行数据交互。本方案从父页面到子页面数据传递采用url...
- **跨域限制**:使用 `window.location` 或 `window.open` 时需要注意同源策略,确保不会违反跨域限制。 #### 七、总结 综上所述,`window.location` 和 `window.open` 在JavaScript中都扮演着重要的角色,但在...
1. **兼容性问题**:不同的浏览器对 `window.open()` 方法的支持程度不同,因此在使用时需要注意浏览器兼容性问题。 2. **弹窗阻止**:许多浏览器都具有弹出窗口阻止功能,这可能会影响 `window.open()` 方法的执行...
后来 Kris Zyp 在此方法的基础上强化了 window.name 传输 ,并引入到了 Dojo (dojox.io.windowName),用来解决跨域数据传输问题。window.name 传输技术的基本原理和步骤为: name 在浏览器环境中是一个全局/window...
这个名称可以用于后续的引用,如`window.name`,或者在`window.open`中重用窗口。 - `features`: 可选参数,一个描述新窗口特性的字符串,比如宽度、高度、位置等。也可以包含像`scrollbars=yes`这样的选项来控制...
当我们谈论“window.open父子窗口传值问题”,我们指的是在父窗口通过`window.open`创建了一个子窗口,并需要在两者之间进行数据通信的情况。 首先,让我们了解一下`window.open`的基本语法: ```javascript var ...
本文将深入探讨如何“完美解决iframe跨域问题”,并介绍其底层的`window.name`转换代理实现。 **一、iframe跨域的基本概念** 1. **什么是iframe**:iframe是一种HTML元素,允许在单个网页中嵌入另一个网页。它通过...
然后,通过A页面的代理文件C.html(与A页面同源),A页面可以安全地读取到`iframe`中的`window.name`,实现跨域数据传输。 4. `window.location.hash`和`iframe` 此方法结合了`hash`和`iframe`,B页面将数据编码后...
原文:http://research.microsoft.com/~helenw/papers/subspace.pdfwindow.name 传输技术,原本是 Thomas Frank 用于解决 cookie 的一些劣势(每个域名 4 x 20 Kb 的限制、数据只能是字符串、设置和获取 cookie 语法...
5. window.name + iframe 跨域 6. postMessage 跨域 7. nginx 代理跨域 8. nodejs 中间件代理跨域 9. WebSocket 协议跨域 一、 通过 jsonp 跨域 通常为了减轻 web 服务器的负载,我们把 js、css,img 等静态资源...
nameStoragenameStorage 是类似 sessionStroage 的键值对数据存储工具,但是可以跨域。nameStorage 适用于同一窗口内跨页面数据存储与传递。技术上,nameStorage 使用 window.name 存储数据。数据的生存周期为窗口...
本篇文章将深入探讨PHP下AJAX跨域的解决方案之一——利用`window.name`属性。 `window.name`是浏览器窗口的一个特殊属性,即使页面重载或URL改变,其值仍能保持不变。这一特性使得`window.name`成为跨域数据传输的...
通过适当的技术实现,如重定向iframe、封装加载逻辑等,可以有效地利用window.name属性解决实际中的跨域数据访问问题。当然,在使用过程中,需要特别关注数据的安全性和隐私保护,避免可能的信息泄露风险。
然而,在某些情况下,由于Cookie的限制(如大小、数量以及跨域问题),开发者可能会寻找替代方案,`window.name`属性就是其中之一。`window.name`是一个特殊属性,它可以存储任意字符串,且在页面刷新或关闭后仍能...