2010-05-14 88 views
0

我有一個類似的代碼:使用查詢JSON數據在函數

$.ajax({ 
     success: function(data) { 
      text = ''; 
      for (var i = 0; i< data.length; i++) { 
       text = text + '<a href="#" id="Data_'+ i +'">' + data[i].Name + "</a><br />"; 
      }    
      $("#SomeId").html(text); 

      for (var i = 0; i< data.length; i++) { 
       $("#Data_"+i).click(function() { 
        alert(data[i]); 
        RunFunction(data[i]); 
        return false; 
       });     
      } 
     } 
    }); 

這得到一些數據的JSON格式的陣列,然後通過這個數組迭代生成鏈路爲每個條目。現在我想爲每個鏈接添加一個函數,該函數將運行一個對此數據執行某些操作的函數。問題是在調用ajax成功函數後數據似乎不可用(儘管我認爲它們的行爲與閉包相似)。稍後使用查詢的json數據的最佳方式是什麼? (我認爲將其設置爲全局變量可以完成這項工作,但我想避免這種情況,主要是因爲此Ajax請求可能會被多次調用)

謝謝。

回答

1

您的問題是i變量由回調共享。

因此,所有的回調運行在最後一個項目上。

最簡單的解決方案是使用$.each

 $.each(data, function(i) { 
      $("#Data_"+i).click(function() { 
       alert(data[i]); 
       RunFunction(data[i]); 
       return false; 
      });     
     }); 

這將使一個單獨的函數調用對於每次迭代,所以會有對於每次迭代的單獨i變量(或者,在此情況下,參數) 。

+0

這看起來不錯,容易 – SztupY 2010-05-14 16:15:59

1

您可以直接使用.bind()和傳遞數據:

for (var i = 0; i< data.length; i++) { 
    $("#Data_"+i).bind('click', {data: data[i]}, function() { 
     alert(event.data.data); 
      RunFunction(event.data.data); 
      return false; 
    });     
} 

我認爲你犯了一個錯誤的經典,試圖產生一個循環的功能。變量i將對所有函數具有相同的值,但在循環結束時它甚至不再是有效的數組索引。

參見JavaScript Closures for Dummies(無犯罪),例如5

+0

沒有冒犯。我確信,關閉不能如我所料,我只是不知道如何讓他們工作。 – SztupY 2010-05-14 16:15:43

0

SLaks回答是一個很好的,但他沒有解釋爲什麼不工作。

問題是由於範圍界定。試試這個:

var logger = function(x){ 
    console.log(x); 
}; 
for(var j = 0; j < 10; j++){ 
    window.setTimeout(function(){ 
    logger(j); 
    }, 1000); 
} 

這個不錯的小功能打印出來只是... 9s!這是因爲參考到j被超時保持,因此由當時的超時運行,J已設置爲9

對比,與:

var logger = function(x){ 
    console.log(x); 
}; 
for(var j = 0; j < 10; j++){ 
    // we're wrapping our call in an anonymous function 
    // don't do this in production code...make the function external instead 
    // so you don't create 10 functions 
    (function(k){ 
    window.setTimeout(function(){ 
     logger(k); 
    }, 1000); 
    })(j); 
} 

這個版本包裝了內心的召喚在一個以作爲參數索引的匿名函數中。由於k的範圍現在僅限於該功能,因此記錄器按您的預期工作。