2010-03-19 110 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