1. 程式人生 > >如何使用jQuery的jsonp解決跨域問題

如何使用jQuery的jsonp解決跨域問題

1.關於jsonp為什麼能解決跨域問題可網上自行搜尋。

此處給兩個個我認為寫的比較明白的部落格

http://www.cnblogs.com/lemontea/archive/2012/12/11/2812268.html

http://www.nowamagic.net/librarys/veda/detail/224/

2.如何使用jQuery的jsonp?

此問題包含兩部分:

部分一:

建立一個提供jsonp服務的站點,這是基礎,如果沒有此步驟,打死你你也測試不了jQuery的jsonp功能。

我的做法是

    A.首先建立一個站點,叫做testjsonp,其下有一個檔案,叫做somejsonp.php;

    B.somejsonp.php中的程式碼如下

       <?php
                     $callback  = $_GET['callback'];
                     $json = "[{\"id\": \"1\", \"name\": \"a\"},{\"id\": \"2\", \"name\": \"b\"}]";
                     echo $callback."(".$json.");";
       ?>

        用什麼語言不是重點,重點是這個伺服器返回的資料yao是一個字串,字串的格式為  函式名(json物件)。此處的函式名是從客戶端傳來的名叫callback引數讀取的(你也可以起別的名字)。

    C.我是啟動apache伺服器,可自行在瀏覽器中輸入地址進行測試 http://localhost:81/testjsonp/somejsonp?callback=?

    

部分二:

客戶端如何使用jQuery的jsonp功能

現在列出四種寫法

A.

           為了讀者能理解jQuery的jsonp的本質,第一種寫法不依賴於任何js庫,如下:

           function mycallback(data){

                   alert(data.length);

           }

           var script   = document.createElement("script");

           script.type = "text/javascript";

           script.src  = "http://localhost:81/testjsonp/somejsonp?callback=mycallback";

           document.getElementByTagName("HEAD")[0].appendChild(script);

B.

           jQuery.getJSON("http://localhost:81/testjsonp/somejsonp?callback=?", function(data) {
               alert(data[1].name);
           });

         

          jQuery的方便體現在雖然伺服器端php傳來的是json的字串,但jQuery自動將其轉化為了json物件,因此可以直接使用data[0].name,

          此寫法的關鍵點在於url,一定要有callback=?這部分,如果沒有,那隻能用下面列舉的C方式。

C.

          jQuery.ajax({
                type: "get",
                url: "http://localhost:81/testjsonp/somejsonp",
                dataType: "jsonp",
                jsonp: "callback",
                success: function(data){
                    alert(data[0].name+data[1].name);
                 }
           });

         

          此方法之所以沒有callback=?是因為jsonp屬性設定了callback,如果不想設定jsonp屬性,那可用D方式。

D.    

          jQuery.ajax({
                type: "get",
                url: "http://localhost:81/testjsonp/somejsonp?callback=?",
                dataType: "jsonp",
                success: function(data){
                    alert(data[0].name+data[1].name);
                 }
           });

          D實際上就是去掉jsonp屬性,然後url採用與B同樣的寫法,即帶有callback=?即可