原文:http://research.microsoft.com/~helenw/papers/subspace.pdf
window.name 傳輸技術(shù),原本是 Thomas Frank 用于解決 cookie 的一些劣勢(shì)(每個(gè)域名 4 x 20 Kb 的限制、數(shù)據(jù)只能是字符串、設(shè)置和獲取 cookie 語(yǔ)法的復(fù)雜等等)而發(fā)明的(詳細(xì)見(jiàn)原文:《Session variables without cookies》),后來(lái) Kris Zyp 在此方法的基礎(chǔ)上強(qiáng)化了 window.name 傳輸 ,并引入到了 Dojo (dojox.io.windowName),用來(lái)解決跨域數(shù)據(jù)傳輸問(wèn)題。
window.name 的美妙之處:name 值在不同的頁(yè)面(甚至不同域名)加載后依舊存在,并且可以支持非常長(zhǎng)的 name 值(2MB)。
window.name 傳輸技術(shù)的基本原理和步驟為:
name 在瀏覽器環(huán)境中是一個(gè)全局/window對(duì)象的屬性,且當(dāng)在 frame 中加載新頁(yè)面時(shí),name 的屬性值依舊保持不變。通過(guò)在 iframe 中加載一個(gè)資源,該目標(biāo)頁(yè)面將設(shè)置 frame 的 name 屬性。此 name 屬性值可被獲取到,以訪問(wèn) Web 服務(wù)發(fā)送的信息。但 name 屬性僅對(duì)相同域名的 frame 可訪問(wèn)。這意味著為了訪問(wèn) name 屬性,當(dāng)遠(yuǎn)程 Web 服務(wù)頁(yè)面被加載后,必須導(dǎo)航 frame 回到原始域。同源策略依舊防止其他 frame 訪問(wèn) name 屬性。一旦 name 屬性獲得,銷毀 frame 。
在最頂層,name 屬性是不安全的,對(duì)于所有后續(xù)頁(yè)面,設(shè)置在 name 屬性中的任何信息都是可獲得的。然而 windowName 模塊總是在一個(gè) iframe 中加載資源,并且一旦獲取到數(shù)據(jù),或者當(dāng)你在最頂層瀏覽了一個(gè)新頁(yè)面,這個(gè) iframe 將被銷毀,所以其他頁(yè)面永遠(yuǎn)訪問(wèn)不到 window.name 屬性。
基本實(shí)現(xiàn)代碼,基于 YUI,源自 克軍寫(xiě)的樣例:
(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; }; })();
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
上一頁(yè) 下一頁(yè) 使用window.name解決跨域問(wèn)題 [2]
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|