2010-03-19 107 views
0

我必须错过简单的东西,但我真的不知道是什么。我不是JS老手,所以这可能是一个简单的答案 - 确实希望如此:)。全局JavaScript变量不能在jQuery变化事件中访问

我有一个按钮,单击它时会获取JSON数据。当更改下拉列表时,我检查是否有数据,如果有,我想清除它,因为下拉列表指示单击按钮时要检索哪些数据。

代码:

var selected, $locDialog; 
var locations = []; 

$(function() { 
// Save the selected Name 
selected = $("#selected option:selected").val(); 

// Setup Dialog for Locations 
$locDialog = $('#location-dialog').dialog({ 
    autoOpen: false 
}); 

// If user changes the selected 
// 1. Prompt for confirmation 
// 2. If users confirms, clear data 
$('#selected').change(function() { 
    if (locations) { 
     var confirmed = confirm("Oh Rly?"); 
     if (confirmed) { 
      // Clear data 
      var locations; 
     } 
    } 
}); 

// When user clicks "Location" Button.. 
$('.loc-select button').click(function() { 
    if (!locations) { 
     $.getJSON("/Controller/JSONAction", { selectedId: selected, pageNum: 1, pageSize: 100 }, function(data) { 
      locations = data; 
      $.each(locations, function(index, loc) { 
       var $tr = $('<tr/>') 
        .append($('<td/>') 
         .append('<input type="checkbox" name="TEST-'+index+'" value="'+loc.Id+'"/>')) 
        .append('<td>' + loc.Name + '</td>'); 
       $("#location-dialog table tbody").append($tr); 
      }); 
     }); 
    } 
    $locDialog.dialog('open'); 
    return false; 
}); 

});

这里的东西,在.click(...)回调里面,我可以看到locations[]。现在,当我在.change(...)回拨时,我看到locationsundefined

任何帮助/见解,一如既往,是赞赏!

回答

5

尝试改变这一行...

// Clear data 
var locations; 

这个...

// Clear data 
locations = []; 

这里发生的事情:你宣布一个新的“位置”变量,它是覆盖全球的一个。在JavaScript中,函数中声明的任何变量在整个函数中都是可见的 - 即使它们是在(看起来像你喜欢的)声明一个嵌套的作用域。

+0

谢谢德鲁:)。问题:回调中的var位置不会立即执行,是吗?我想这就是为什么我从来没有想过改变这一点。我知道这很简单! – Dan 2010-03-19 17:52:56