2010-10-17 38 views
0

我有這樣的代碼來填充我的選擇框中選擇使用它(我在這第7頁選擇框)從服務器(阿賈克斯)保存Ajax調用的ID在返回功能

JSON響應
for (j=1; j <= 7; j++){ 

      $.getJSON('mobile_json.php', {id:j}, function(data) { 
       var select = $('#userAccess' + j);    
       var options = select.attr('options'); 
       $.each(data, function(index, array) {     
        options[array['Id']] = new Option(array['Name']); 
       }); 
      }); 
    } 

的問題是調用的AJAX後,當函數處理JSON數組中,將其設置爲一樣,正確選擇框的j等於8, 我想是:userAccess1,userAccess2 ... userAccess7,

我該如何處理?

回答

4

這是因爲您正在循環中創建閉包。 This helped me to understand it better(特別是例5)。要解決這個

一種方法是創建一個匿名函數並立即執行:

for (j=1; j <= 7; j++){ 
    (function(index) { 
     $.getJSON('mobile_json.php', {id:index}, function(data) { 
      var select = $('#userAccess' + index);    
      var options = select.attr('options'); 
      $.each(data, function(index, array) {     
       options[array['Id']] = new Option(array['Name']); 
      }); 
     }); 
    })(j) 
} 

這個「捕獲」的j當前值。如果您不這樣做,則在執行閉包(對Ajax請求的回調函數)時,循環已完成,並且j的值爲8
這是關閉關閉的難題:)

+0

我在Crockford的書中讀到了這個確切的東西。 :) – 2010-10-17 06:51:50

+0

非常感謝 – 2010-10-17 07:05:21