用原生js來處理跨域的數據(jsonp)


說明總結:

1.ajax和jsonp其實本質上是不同的東西。ajax的核心是通過XmlHttpRequest獲取非本頁內容,而jsonp的核心則是動態添加<script>標簽來調用服務器提供的js腳本

2.但是ajax和jsonp在數據傳輸的過程中都是可以用json格式的數據。

3.其實ajax與jsonp的區別不在於是否跨域,ajax通過服務端代理一樣可以實現跨域,jsonp本身也不排斥同域的數據的獲取。

4.ajax和jsonp這兩種技術在調用方式上“看起來”很像,目的也一樣,都是請求一個url,然后把服務器返回的數據進行處理,因此jquery和ext等框架都把jsonp作為ajax的一種形式進行了封裝;

服務器端代碼:

 1 //獲取客戶端的信息
 2     if (isset($_GET['code'])) {
 3         if ($_GET['code'] == "CA1998") {
 4             $flightId = $_GET['code'];
 5             $price = 1000;
 6         }
 7         else if ($_GET['code'] == "CA1997") {
 8             $flightId = $_GET['code'];
 9             $price = 2000;
10         }
11         else{
12             $flightId = 0;
13             $price = 0;
14         }
15         $flightHandler = array('flightId'=>$flightId,'price'=>$price); 
16         $flightHandler = json_encode($flightHandler);
17 $flightHandler = "flightHandler(".$flightHandler .");";// 將數據進行了包裝,包裝成了一個調用的函數,這一步很重要。 18         print_r($flightHandler);
19     }

獲取到的服務器數據:

1 flightHandler({
2     "flightId": "CA1998",
3     "price": 2000
4 });
5 //其實就在服務器端把json數據包裝成了一個js的函數,將一個對象作為參數放在函數里面。所以跟ajax用XMLHttpRequest接收數據是不一樣的。

傳統ajax獲取到的json數據:

1 {
2     "flightId": "CA1998",
3     "price": 2000
4 }

客戶端代碼:

 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>XHR</title>
 6     <link rel="stylesheet" href="../templates/css/verify.css">
 7 </head>
 8 <body>
 9     <label for="flightId">輸入:CA1998 或者 CA1997 </label> <input type="text" id="flightId" name="flightId"> <input type="button" value="原生js獲取jsonp數據(php包裝數據)" onclick="flightHandler0()"><input type="button" value="原生js獲取jsonp數據(js包裝數據)" onclick="flightHandler1()">
10  <script type="text/javascript">
11 
12     // 得到航班信息查詢結果后的回調函數
13     function flightHandler(data){
14         if (data.price != 0) {
15              alert('你查詢的航班結果是:票價 ' + data.price + ' 元,' + '航班 ' + data.flightId );
16         } else{
17             alert("EORROR");
18         };
19        
20     };
21 
22     function flightHandler0(){
23         var flightId = document.getElementById('flightId').value;
24          //供jsonp服務的url地址(不管是什么類型的地址,最終生成的返回值都是一段javascript代碼)
25          //其實參數都是前端和后台程序員規定的,前端傳過去,后端判斷獲取即可。
26         var url = "flightResult.php?code=" + flightId +"&callback=flightHandler"; 27         // 創建script標簽,設置其屬性
28         var script = document.createElement('script');
29         script.setAttribute('src', url);
30         // 把script標簽加入head,此時調用開始
31         document.getElementsByTagName('head')[0].appendChild(script); 
32     };
33 
34     </script>
35 </body>
36 </html>

設想:

上面的方法是在服務器端把json數據包裝在回調函數里面,那能不能在客戶端來做這個事情呢?但是試了一下感覺行不通。

在服務器端把

$flightHandler = "flightHandler(".$flightHandler .");";

去掉。

留言中有用jquery寫的jsonp的例子。

最后附上用原生js和jquery分別處理jsonp的例子:

js:http://snowinmay.net/ajax/xhr-js-jsonp.html

jsonp:http://snowinmay.net/ajax/xhr-jquery-jsonp.html

所以返回數據應該是json數據,但是在客戶端好像沒有很好的辦法來包裝這個數據。如果有的話以后再補充。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM