需求:
A域有頁面a.html,其中有iframe包含B域的頁面b.html,現在要透過a.html上的一個按鈕,來把a.html頁面上一個文字方塊的值傳遞到b.html頁面的文字方塊。
註:這裡b.html是html網頁,不能接收其他網站post過來的值,所以不能用直接post的方法來傳值,但是,如果接收頁是b.aspx或b.asp 呢,那不是可以直接post了麼?答案是肯定的,確實可以,但是b.asp或b.aspx必須要刷新,才可以,如何能不刷新的動態改變接收頁的元素或值呢? (IE的本機專案是可以實現跨網域存取的,但是外網的跨網域存取預設是被拒絕的。FireFox本機專案以及外網的跨網域存取權都是被拒絕的。)
原理:
瀏覽器禁止跨網域資料訪問,但是瀏覽器並沒有禁止跨域跨框架的post傳值。我們可以在A域,post到B域的某個頁面的框架中,然後透過B域的框架頁來實現本域內的資料存取。這其實是html應用程式中的一個小技巧,並沒有用到其他高深的知識就實現了跨域的資料提交。
方法:
在B域中新增兩個頁面,來實現跨域的資料訪問,post.aspx和main.aspx。
頁面關係如下,A域的a.html包含一個框架,框架頁位址是B域的main.aspx,main.aspx是一個框架集包含兩個框架,(frmMain)b.html 和(frmPost)post.aspx .
A域的a.html:
<form action=" http://www.b**.com/post.aspx " method="post" target="frmPost">
<input id="cmd" type=" text" size="20">
<input type="submit">
</form>
<iframe src=" http://www.b**.com/main.aspx"></iframe >
B域的main .aspx:
<frameset rows="*,0" frameborder="no" border="0" framespacing="0">
<frame src="b.html" name="frmMain">
<frame src="post. aspx" name="frmPost">
</frameset>
我們先把要傳遞到B域的資料儲存到a.html的form中,然後post到B域的post.aspx.
這時post.aspx接收到值,然後執行本域內的父框架存取b.html。
string cmd = Request.Form["cmd"];
if (null != cmd && string.Empty != cmd)
{
Response.Write("<script language="JavaScript" for="window" event= "onload"> if (parent && parent.frames["frmMain"]) { 這裡加入控制b.html的執行程式碼} </script> ");
}
不難發現,這裡利用跳躍跨frame(即中間躍過了一層frame)的方法,來實現跨域的資料存取。即post到frame的子frame裡面。
後記:
這個例子不過是一些特殊的情況下跨域訪問的解決方案,也許對你會有所幫助。因為方法簡單,應用也有許多限制。 (不過偶倒是覺得這樣很像ajax哦,頁面沒有刷新,同樣完成了一次服務端的資料處理^o^)。
相關網文資料:
web應用的跨網域存取解決方案
做過跨越多個網站的Ajax開發的朋友都知道,如果在A網站中,我們希望使用Ajax來獲得B網站中的特定內容,如果A網站與B網站不在同一個網域中,那麼就出現了跨網域存取問題。 Ajax的跨域存取問題是現有的Ajax開發人員比較常遇到的問題。
IE對於跨網域存取的處理是,彈出警告框,提醒使用者。如果使用者將該網站納入可信任網站,或調低安全級別,那麼這個問題IE就不會在提醒你。
FireFox等其它非微軟的瀏覽器遇到跨域訪問,則解決方案統一是拒絕訪問。
有人說,IE是主流瀏覽器,只要它能正常使用就好了。此言差已,IE雖然能夠處理,但是是有前提的,要么用戶不厭其煩地在頁面彈出警告框之後點擊是(點擊否就不執行該Ajax調用了),要么用戶將該網站納入可信站點。這兩種做法,在企業管理系統的應用中倒是比較常見,因為系統管理員可以以行政手段保證使用者的行為。但是對於網路上的網站或入口網站開發,這種做法則不行。
最近遇到了這個問題,需要在跨域訪問結束之後完成使主視窗出現一些特效,搜索了一些資料,通過不斷嘗試以及在不同瀏覽器中進行兼容性測試,找到了幾個可行的方案:
1、 Web代理程式的方式。即用戶造訪A網站時所產生的對B網站的跨域訪問請求均提交到A網站的指定頁面,由該頁面代替用戶頁面完成交互,從而返回合適的結果。此方案可以解決現階段所能夠想到的多數跨域訪問問題,但要求A網站提供Web代理的支持,因此A網站與B網站之間必須是緊密協作的,且每次交互過程,A網站的伺服器負擔增加,且無法代用戶保存session狀態。
2、on-Demand方式。 MYMSN的門戶就用的這種方式,不過MYMSN中不涉及跨域訪問問題。動態控制script標記的生成,透過修改script標記的src屬性完成對跨域頁面的呼叫。此方案存在的缺陷是,script的src屬性完成該呼叫時採取的方式時get方式,如果請求時傳遞的字串過大時,可能會無法正常運作。不過此方案非常適合聚合類別入口網站使用。
3、iframe方式。查看過醒來在javaeye上的一篇關於跨域訪問的帖子,他提到自己已經用iframe的方式解決了跨域訪問問題。資料提交跟獲取,採用iframe這種方式的確可以了,但由於父窗口與子窗口之間不能交互(跨域訪問的情況下,這種交互被拒絕),因此無法完成對父窗口效果的影響。
(偶找到了該文,補充一下地址:http: //www.javaeye.com/topic/15641 )
4. 使用者本地轉儲方式:IE本身依附於windows平台的特性為我們提供了一種基於iframe,利用記憶體來「繞行」的方案,也就是兩個window之間可以在客戶端透過windows剪貼簿的方式進行資料傳輸,只需在接受資料的一方設定Interval進行輪詢,取得結果後清除Interval即可。 FF的平台獨立性決定了它不支援剪貼簿這種方式,而以往版本的FF中存在的插件漏洞又被fixed了,所以FF無法透過記憶體來完成暗渡陳倉。而由於檔案操作FF也沒有提供支援(無法透過Cookie跨域完成資料傳遞),致使這種技巧性的方式只能在IE中使用。
5.我自己用來解決這類問題的方式:結合了前面幾種方式,在造訪A網站時,先請求B網站完成資料處理,再根據傳回的識別來獲得所需的結果。這種方法的缺點也很明顯,B網站的負載增加了。優點,對session也實現了維持,同時A網站與B網站頁間的互動能力增強了。最重要的一點,這個方案滿足了我的全部需求。
總結一下,在以上方案中可選擇的情況下,我最推薦on-Demand方式,在不需要提交大量資料的情況下,這種方式能夠解決您的大部分問題。
web應用的跨域存取解決方案網址:http: //www.newbooks.com.cn/info/37166.html
http://www.cnblogs.com/lgamoy/archive/2006/11/23/569633.html