2012-01-18 64 views
0

所以我寫了一個使用dataType的json調用github:json,它在我的本地機器上工作,但似乎我需要使用dataType:jsonP來處理跨域問題。所以任何人都可以幫助我做出必要的改變。 (順便說一句github上似乎支持JSONP數據類型 - https://github.com/pgxn/pgxn-api/wiki/JSONPjquery jsonp和了解如何回調工作

$.ajax({ 
    url: "https://api.github.com/repos/jeffreycwitt/prollecture1/tags", 
    dataType: "jsonp", 
    crossDomain: true, 
    success: function(returndata) { 
     if (returndata.length === 0) { 
      $("#versionBox").remove(); 
     } 
     else if (returndata.length === 1) { 
      $("#versionBox").remove(); 
     } 
     else { 
      $.each(returndata, function() { 
       $("#versionBox").show(); 
       var tag = this["name"]; 
       console.log(tag); 
       var currentVersion = $("#editionNumber").text(); 
       if (tag.substring(1) === currentVersion) { 
        tag = tag + " (Current Version)"; 
       } 
       var linkname = "textdisplay.php?flag=<?php echo $fs; ?>&ed=" + tag; 
       $('#versionSubBox').append("<p><a href='" + linkname + "'>View Version: " + tag + "</a></p>"); 
      }); 

     } 
    } 
}); 

就像我說的,這時候我只是用數據類型JSON,但它不是用JSONP工作是工作。我在印象之下github將發送回常規json包裝在由呼叫?callback=?添加到回調參數指定的東西。 (此參數時,數據類型更改爲JSONP jQuery的自動添加。所以我需要以某種方式修改我的成功函數通過包裝來分析?

+0

是否有意讓您的網址返回空([])? – j08691 2012-01-18 18:03:45

+0

哎呀,不,我會改變 – Jeff 2012-01-18 18:12:09

+0

現在嘗試它 - 也如果使用curl和add?callback = foo - 你會看到什麼樣的返回數據。我想我只是不知道如何解析什麼返回 – Jeff 2012-01-18 18:14:43

回答

1

您的代碼似乎在這個live demo看到工作。

您所遇到的問題是,你正在試圖訪問 returndata對象,這些財產在.length屬性不存在:

{ 
    "data": [ 
     { 
      "tarball_url": "https://github.com/jeffreycwitt/prollecture1/tarball/v0.2", 
      "commit": { 
       "sha": "46a8aea57cd095a603f194f83cd4a18adcb35908", 
       "url": "https://api.github.com/repos/jeffreycwitt/prollecture1/commits/46a8aea57cd095a603f194f83cd4a18adcb35908" 
      }, 
      "name": "v0.2", 
      "zipball_url": "https://github.com/jeffreycwitt/prollecture1/zipball/v0.2" 
     } 
    ], 
    "meta": { 
     "status": 200, 
     "X-RateLimit-Limit": "5000", 
     "X-RateLimit-Remaining": "4993" 
    } 
} 

我猜你的意思是returndata.data.length,因爲您有一個data屬性,它是一個數組。

所以:

var data = returndata.data; 
if (data.length === 0) { 
    $("#versionBox").remove(); 
} 
else if (data.length === 1) { 
    $("#versionBox").remove(); 
} 
else { 
    $.each(data, function() { 
     $("#versionBox").show(); 
     var tag = this["name"]; 
     console.log(tag); 
     var currentVersion = $("#editionNumber").text(); 
     if (tag.substring(1) === currentVersion) { 
      tag = tag + " (Current Version)"; 
     } 
     var linkname = "textdisplay.php?flag=<?php echo $fs; ?>&ed=" + tag; 
     $('#versionSubBox').append("<p><a href='" + linkname + "'>View Version: " + tag + "</a></p>"); 
    }); 
} 
+1

Github很奇怪。當通過JSONP調用時,他們實際上改變了響應。 – Anurag 2012-01-18 18:32:33

+0

@Auurag,是的,這是OP的問題。如果他使用過FireBug或一個JavaScript調試工具,他會立即看到這一點。自從Phil Haack加入他們之後,奇怪的事情開始發生了:-) – 2012-01-18 18:34:29

+0

成功 - 非常感謝 - 基本上jsonp增加了我需要解析的另一層 - 所以一旦我使用了returndata.data [0] .length - - 一切都很好 – Jeff 2012-01-18 18:41:19

0

答案(具體到GitHub上,我猜)在於通過不包括在正常的JSON呼叫數據的額外的一層找到自己的方式。

所以在這裏如何改變代碼。在三個特定點上,我將returndata更改爲returndata.data

$.ajax({ 
url: "https://api.github.com/repos/jeffreycwitt/prollecture1/tags", 
dataType: "jsonp", 
crossDomain: true, 
success: function(returndata) { 
    if (returndata.data[0].length === 0) { 
     $("#versionBox").remove(); 
    } 
    else if (returndata.data[0].length === 1) { 
     $("#versionBox").remove(); 
    } 
    else { 
     $.each(returndata.data, function() { 
      $("#versionBox").show(); 
      var tag = this.name; 
      console.log(tag); 
      var currentVersion = $("#editionNumber").text(); 
      if (tag.substring(1) === currentVersion) { 
       tag = tag + " (Current Version)"; 
      } 
      var linkname = "textdisplay.php?flag=<?php echo $fs; ?>&ed=" + tag; 
      $('#versionSubBox').append("<p><a href='" + linkname + "'>View Version: " + tag + "</a></p>"); 
     }); 

    } 
} 
});