在Ajax應用中,jQuery的Ajax請求是非常容易而且方便的,但是初學者經常會犯一個錯誤,那就是Ajax請求的url不是本地或者同一個服務器下面的URI,最后導致雖然請求200,但是不會返回任何數據,事實上簡單來說請求同一個域名下的url或者說用不帶http的絕對路徑和相對路徑請求是沒有任何問題的,如果請求外部資源,那么這就稱為跨域請求。
由於安全性的問題,瀏覽器默認不支持跨域調用,晚上也有很多方法,各有優缺點,但是有一個比較好的解決方法這也是jQuery1.2之后官方推薦的,那就是在客戶端和服務端同時加參數,這樣雙方都是信任的那么瀏覽器就不會阻止了,舉個例子:
先看客戶端代碼:
1 $.getJSON("http://domain/home/join/test?jsoncallback=?",{"from":$("#homecity_name").val(),"to":$("#getcity_name").val(),"time":$("#time").val()},function(result){ 2 if(result == "pass"){ 3 //具體操作 4 return true; 5 } 6 });
不必關心參數和回調等細節,主要看請求的URI中,多了個參數jsoncallback=?,就這么簡單,其他完全不變
然后看服務端:
1 public function test(){ 2 $ajax = I('get.jsoncallback'); 3 echo $ajax."('pass')"; 4 }
其他的邏輯也不用考慮,主要看先通過get獲取jsoncallback參數的值,然后返回jsoncallback值開頭的json數據格式,而這個jsoncallback參數的值是變化的,最終正好的服務端返回的一致,所以最終獲得回調數據,這里只是簡單的例子,實際上返回值還可以寫成:$ajax."('name':'value'....)";這種格式
那么請求地址是:http://domain/home/join/test?jsoncallback=jQuery111107590998236555606_1445756963910&from=%E4%B8%8A%E6%B5%B7&to=%E5%B9%BF%E5%B7%9E&time=2015-10-25&_=1445756963911
這里的參數是:jsoncallback=jQuery111107590998236555606_1445756963910
那么回調結果就是:jQuery111107590998236555606_1445756963910('pass')
現在原理就清楚了吧,實際上我們並不需要關心jsoncallback的值,我們使用返回值的方法還是不變,這只是瀏覽器和服務器之間的一種跨域交互方式
繼續補充:如果是我們用底層的ajax方法請求后台json數據時,寫法可以如下:
1 $.ajax({ 2 type:"get", //請求方式 3 async:true, //是否異步 4 url:"http://www.domain.net/url", 5 dataType:"jsonp", //跨域json請求一定是jsonp 6 jsonp: "callbackparam", //跨域請求的參數名,默認是callback 7 //jsonpCallback:"successCallback", //自定義跨域參數值,回調函數名也是一樣,默認為jQuery自動生成的字符串 8 data:{"query":"civilnews"}, //請求參數 9 10 beforeSend: function() { 11 //請求前的處理 12 }, 13 14 success: function(data) { 15 //請求成功處理,和本地回調完全一樣 16 }, 17 18 complete: function() { 19 //請求完成的處理 20 }, 21 22 error: function() { 23 //請求出錯處理 24 } 25 });
這就是用ajax請求的具體方法,其他的使用都完全一樣,服務端返回json數據要用小括號包圍,例如本例用php可以這樣寫:
echo $_GET['callbackparam']."(".json_encode($result_array).")";
這樣返回就行了,其余都一樣
到這里,高層的get,getJSON和底層的ajax跨域請求,都能很容易的解決了
