ajax本身實際上是通過XMLHttpRequest對象來進行數據的交互,而瀏覽器出于安全考慮,不允許js代碼進行跨域操作,所以就誕生了很多跨域的解決方案。當本域和子域間進行訪問時最簡單的就是設置document.domain,當不同域的訪問,大概有下列方法:
1.web端代理的方式,即用戶訪問A網站時所產生的對B網站的跨域訪問請求均提交到A網站的指定頁面,由該頁面代替用戶頁面完成交互,從而返回合適的結果。
2.iframe,解決方案就是用window.location對象的hash屬性,利用JS改變hash值網頁不會刷新,可以這樣實現通過JS訪問hash值來做到通信,大體就是AB網站各嵌入一個對方網站的iframe,然后通過連續不斷的監聽hash值的變化來進行通信。比如A網站通過改變B網站iframe的hash后,B網站監聽到hash的變化后就進行處理,這種方式需要開發者可以控制兩個網站的代碼。
3.通過script標簽來請求,原理就是在本域內的A內生成一個JS標簽,它的SRC指向請求的另外一個域的某個頁面B,這個src里面通常會加一個A頁面定義好的回調函數,B返回數據即可,可以直接返回調用這個回調函數,這種跨域的通信方式被稱為JSONP,此方案存在的缺陷是, script的src屬性完成該調用時采取的方式時get方式,如果請求時傳遞的字符串過大時,可能會無法正常運行。
4.window.name,window.name是一種解決跨域數據傳輸的新技術,通過在iframe中加載一個跨域的HTML文件,并且在HTML文件中設置window.name的值為需要傳給接受者的數據,接收者就可以取得到window.name的值并且返回,比較關鍵的是同源策略的影響對location的控制不受限制,所以需要加載一個代理的頁面來讓發送頁面讀取window.name.
5.使用flash,原理是JavaScript將數據提交給本域下的 Flash,通過 Flash 中轉去訪問其他域的接口,只需要其他域的根目錄下有一個crossdomain.xml文件,文件中設置允許所有域名或允許本域訪問即可。
了解更多,請看:
http://www.phpchina.com/html/48/n-33848.html
http://www.sitepen.com/blog/2008/07/22/windowname-transport/
http://www.planabc.net/2008/09/01/window_name_transport/