2011-11-03 44 views
0

我取一个JSON响应,并与响应,我有两个值:无法访问页面范围内JavaScript变量

  1. 空运成本。
  2. 陆运费用。

我想将这两个值保存在客户端的某个位置,这样当用户选择一个单选按钮或另一个单选按钮时,我会将该值添加到页面上的另一个元素。

下面是我在做什么:

<script type="text/javascript"> 
    $(document).ready(function() { 
     var landCost; 
     var airCost; 

$("#ddlCiudad").change(function() { 
    var idCity = $("#ddlCiudad").val(); 
    $.getJSON("/ProductCheckout/GetPriceForLocation", { cityId: idCity, productId: idProduct, type: "land" }, 
     function (cityData) { 
      console.log("Recieved json data."); //This part works. It outputs. 

      var data = $.parseJSON(cityData); 
      console.log("Parse JSON response."); //This part works. It outputs. 

      landCost = data.LandCost; 
      console.log("Assigned value of LandCost"); //FAILS HERE. nothing is shown. not even an error. 
      airCost = data.AirCost; 
      console.log("Assigned value of AirCost"); 

      alert(landCost); 
      console.log("Alerted land!"); 
      alert(airCost); 
      console.log("Alerted air!"); 
     } 
    ); 
}); 

所以,你有什么建议?如果我在change()事件中声明变量,则需要具有此JSON响应的值,可用于该页面,否则它将超出范围。

{"DaysToShip":" TER = 48 Hrs/AER = 24 Hrs","LandCost":"25,00","AirCost":""} 
+0

一个快速解决方法是将'landCost'和'airCost'声明移到文档之外,这样它们将成为全局的。 – hyperslug

+0

我不明白为什么它会在你标记的地方失败。如果你在'parseJSON'后加上'console.log(data)',你会得到你期望的对象吗? – hyperslug

回答

0

尝试

landCost = cityData.LandCost; 
+1

解决了我的问题。 :)虽然好奇,如果我可以像这样访问JSON值,为什么我需要parseJSON方法? –

+0

我收回来了,我想OP没有发布实际的布局。 @Sergio,如果您调用$ .getJSON,那么jquery会自动解析它并返回一个可立即使用的对象/数组。 – david

+0

从http://api.jquery.com/jQuery.getJSON/'从jQuery 1.5开始,成功回调函数接收一个“jqXHR”对象,所以我的猜测是parseJSON方法是不必要的 – Kostis

-1

,如果你想在全球范围内声明变量,要么把他们关闭的jQuery($(document).ready(function() {...});)外,或者不使用var声明它们。如果您不使用var关键字,则变量将默认为全局。

这里是设置全局变量,不会使用var关键字的的jsfiddle:http://jsfiddle.net/jasper/JWtbV/

+0

从不建议人们不要使用'var'。全局是坏的,但是像这样隐含地创建它们是更糟的一个数量级。 – david

+0

运行一些性能测试后,速度会变慢(这并不令人震惊),但更像是慢了20%,而不是100%或更糟。 – Jasper

+0

从风格的角度来看,我的意思是“更糟糕”,而不是表现。 – david

-1

你有没有考虑直接使用jQuery的$.data()功能附值到DOM body元素,并从那里访问它?

// Set Values 
$('body').data('landCost', data.LandCost); 
$('body').data('airCost', data.AirCost); 

// Retrieve Values // 
console.log($('body').data('landCost'); 
console.log($('body').data('airCost'); 

希望它有帮助。

0

如果您确实必须使用全局变量,则可以将它们直接附加到窗口对象。

window.airCost = cityData.AirCost; 

真的不过你想拥有的JSON请求和“单选按钮”在同一范围内处理,让你不污染全局命名空间可言。

0

您拨打$.parseJSON()的电话将返回null,因为传递给您的回调的数据已被解析为JSON。

var json = {LandCost:3, AirCost:5}, 
    results = $.parseJSON(json); 

console.log(results); // results == null