由于JS同源策略的影響,因此js只能訪問同域名下的文檔。因此要實(shí)現(xiàn)跨域,一般有以下幾個方法: 一、處理跨域的方式: 1.代理 2.XHR2 HTML5中提供的XMLHTTPREQUEST Level2(及XHR2)已經(jīng)實(shí)現(xiàn)了跨域訪問。但ie10以下不支持 只需要在服務(wù)端填上響應(yīng)頭: 3.jsonP 原理: ajax本身是不可以跨域的, 其實(shí)設(shè)置了dataType: 'jsonp'后,$.ajax方法就和ajax XmlHttpRequest沒什么關(guān)系了,取而代之的則是JSONP協(xié)議。JSONP是一個非官方的協(xié)議,它允許在服務(wù)器端集成Script tags返回至客戶端,通過javascript callback的形式實(shí)現(xiàn)跨域訪問。 ajax的跨域?qū)懛ǎ?/p> (其余寫法和不跨域的一樣): 比如
二、解決ajax跨域訪問、 JQuery 的跨域方法 JS的跨域問題,我想很多程序員的腦海里面還認(rèn)為JS是不能跨域的,其實(shí)這是一個錯誤的觀點(diǎn);有很多人在網(wǎng)上找其解決方法,教其用IFRAME去解決的文章很多,真有那么復(fù)雜嗎?其實(shí)很簡單的,如果你用JQUERY,一個GETJSON方法就搞定了,而且是一行代碼搞定。 下面開始貼出方法。
注意,getregion.aspx中,在輸出JSON數(shù)據(jù)時(shí),一定要用Request.QueryString["jsoncallback"],將獲取的內(nèi)容放到返回JSON數(shù)據(jù)的前面,假設(shè)實(shí)際獲取的值為42342348,那么返回的值就是 42342348([{"_name":"湖南省","_regionId":134},{"_name":"北京市","_regionId":143}]) 因?yàn)間etJSON跨域的原理是把?隨機(jī)變一個方法名,然后返回執(zhí)行的,實(shí)現(xiàn)跨域響應(yīng)的目的。 下面一個是跨域執(zhí)行的真實(shí)例子:
jQuery跨域原理: 瀏覽器會進(jìn)行同源檢查,這導(dǎo)致了跨域問題,然而這個跨域檢查還有一個例外那就是HTML的<Script>標(biāo)記;我們經(jīng)常使用<Script>的src屬性,腳本靜態(tài)資源放在獨(dú)立域名下或者來自其它站點(diǎn)的時(shí)候這里是一個url;這個url響應(yīng)的結(jié)果可以有很多種,比如JSON,返回的Json值成為<Script>標(biāo)簽的src屬性值.這種屬性值變化并不會引起頁面的影響.按照慣例,瀏覽器在URL的查詢字符串中提供一個參數(shù),這個參數(shù)將作為結(jié)果的前綴一起返回到瀏覽器; 看下面的例子:
這種方式被稱作JsonP;(如果鏈接已經(jīng)失效請點(diǎn)擊這里:JSONP);即:JSON with padding 上面提到的前綴就是所謂的“padding”。那么jQuery里面是怎么實(shí)現(xiàn)的呢? 貌似并沒有<Script>標(biāo)記的出現(xiàn)!?OKay,翻看源碼來看: 頁面調(diào)用的是getJSON: 繼續(xù)跟進(jìn) 跟進(jìn)jQuery.ajax,下面是ajax方法的代碼片段:
上面的代碼第1行到第10行:判斷是JSON類型調(diào)用,為本次調(diào)用創(chuàng)建臨時(shí)的JsonP方法,并且添加了一個隨機(jī)數(shù)字,這個數(shù)字源于用日期值; 關(guān)注第14行,這一行相當(dāng)關(guān)鍵,注定了我們的結(jié)果最終是<Script> ;然后是構(gòu)造Script片段,第95行在Head中添加該片段,修成正果; 不僅僅是jQuery,很多js框架都是用了同樣的跨域方案,這就是getJSON跨域的原理。 |
|