2012-11-23 245 views
-1

我試圖解析一個JSON響應,但$ .getJSON中的任何指令都無法執行。

的json.html

<!DOCTYPE html> 
<html> 
    <head> 
     <script src="js/jquery.js"></script> 
    </head> 
    <body> 
     <script> 
      $.getJSON("json.php?jsoncallback=?", function(data) { 
       var a = data[0].cve_id + 'something'; 
      }); 
      alert(a); //chrome says "a is not defined" 
     </script> 
    </body> 
</html> 

的json.php:

<?php 
header("Content-Type: application/json", true); 
echo file_get_contents("http://www.cvedetails.com/json-feed.php?numrows=10&vendor_id=0&product_id=0&version_id=0&hasexp=1&opec=1&opov=1&opcsrf=1&opfileinc=1&opgpriv=1&opsqli=1&opxss=1&opdirt=1&opmemc=1&ophttprs=1&opbyp=1&opginf=1&opdos=1&orderby=1&cvssscoremin=0"); 
?> 

任何想法,爲什麼?

LATER:

感謝您的回覆。我明白了原因。

我已將$.getJSON更改爲$.get,並指定了data typejson

+1

你的AJAX是異步的。變量有範圍。 –

+1

當'alert(a)'發生時,異步AJAX調用還沒有完成。你需要在'function(data)'回調中提醒(a)'。如果您需要使用該值來修改DOM,則必須在回調中執行此操作 –

+2

_chrome表示「a未定義」_ - 這是因爲'a'在回調函數中定義爲_local_變量,您將其傳遞給' $ .getJSON()',因此只能在該函數內部訪問(即使除了異步問題)。 – nnnnnn

回答

1

風險價值是在回調閉包(匿名函數)內部定義的。使用閉包的主要原因之一是它們產生私人範圍。即函數內部定義的任何變量都不可用於函數之外的代碼。

這將工作:

$.getJSON("json.php?jsoncallback=?", function(data) { 
    var a = data[0].cve_id + 'something'; 
    alert(a); 
}); 
2

JSON調用是異步的,所以回調函數不會被調用,直到你嚴格的返回數據,但JavaScript代碼會繼續運行到下一行代碼。導致STIL是不確定的嘗試將其更改爲財產以後的線沿線:

$.getJSON("json.php?jsoncallback=?", function(data) { 
    var a = data[0].cve_id + 'something'; 
    alert(a) 
}); 

您可以定義其他方法回調之外,並調用他們,當事件發生蒙山的propper數據