2013-04-24 22 views
0

我有下面的語法,正常工作100%,並填充相應的複選框:帶有ajax請求的jquery循環與包含的警報完美協作,沒有警報失敗?

for (var i = 1; i < 30; i++) {  
$.post('get_sku_prices', {data: $('#product'+i).val()},function(result) { 
    $('#price'+i).val(result); 
    $('#adjustedprice'+i).val(result); 
}); 
alert(i); 
} 

如前所述正常工作。如果我刪除警報,只是有

for (var i = 1; i < 30; i++) { 
$.post('get_sku_prices', {data: $('#product'+i).val()},function(result) { 
    $('#price'+i).val(result); 
    $('#adjustedprice'+i).val(result); 
}); 

} 

的字段沒有被填充沒有警報,幾乎像警報迫使頁面刷新。

任何想法?在此先感謝...

+0

阿賈克斯是異步的。這些字段正在更新,你只是沒有等待足夠長的時間來完成請求。你的for i循環中也有一個典型的範圍問題。 – 2013-04-24 15:21:09

+0

感謝凱文,有關如何解決這個問題的任何建議? – Smudger 2013-04-24 15:23:34

+0

我建議看一些ajax教程。你錯過了ajax如何工作的基本部分。 http://learn.jquery.com/ajax/key-concepts/主要是*「A是爲異步」*部分。 – 2013-04-24 15:24:27

回答

1

您可以創建自己的作用域的功能,這樣的事情:

for (var i = 1; i < 30; i++) { 
    (function (index) { 
     $.post('get_sku_prices', { 
      data: $('#product' + index).val() 
     }, function (result) { 
      $('#price' + index).val(result); 
      $('#adjustedprice' + index).val(result); 
     }); 
    })(i) 
} 
+0

冠軍。謝謝,100%正確工作!通過範圍函數來表達什麼意思?函數index()是做什麼的?再次感謝。 – Smudger 2013-04-24 19:29:15

+0

任何評論這個來幫助我的機會,對不起我知道我很厚臉皮,只需要確保我明白它:-)再次感謝...... – Smudger 2013-04-24 19:51:50

+0

@Smudger你必須瞭解範圍/封閉如何在JavaScript中工作。看到例如:http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/在我的答案的代碼中,index是一個參數,它引用來自'for'循環的'i'變量。由於ajax請求在缺省情況下是異步的,因此使用閉包函數時,您確定您的'索引'在實例化時對應於'i'的正確值。否則,如果沒有使用閉包(作用域)函數,'index'會在代碼調用時獲得值,在這裏,對於所有的ajax請求,肯定是30。 – 2013-04-24 20:20:23

2

這是因爲在第一種情況下,alert()阻塞,並需要被解僱循環繼續。

在第二種情況下(沒有警報),ajax調用立即執行而不等待響應。即當第一個請求(i=1)的響應到達時,i不一定是1

您可以使用$.ajax及其context選項來解決該問題。

例如:

for (var i = 1; i < 30; i++) {  
    $.ajax({ 
     type: 'POST', 
     url: 'get_sku_prices', 
     data: {data: $('#product'+i).val()}, 
     context: {index: i}, // this value will be available in success as "this" 
     success: function(result) { 
      $('#price'+this.index).val(result); // use "this.index" here 
      $('#adjustedprice'+this.index).val(result); 
     } 
    }); 
} 
+0

謝謝,我該如何解決這個問題,以便它可以更新輸入? – Smudger 2013-04-24 15:22:53

+1

+1對於背景 – panther 2013-04-24 15:29:28

+0

謝謝techfoobar。這是行不通的。我不能看到任何服務器響應或發佈?感謝您的時間和知識! – Smudger 2013-04-24 19:10:44

0

發送數到服務器,並嘗試獲得計數回到你的結果,並根據從結果而不是從計數for循環收到的計數做改變。

0

嘗試在函數執行加入一些延遲

var i=0; 
function postRequest(i){ 
$.post('get_sku_prices', {data: $('#product'+i).val()},function(result) { 
    $('#price'+i).val(result); 
    $('#adjustedprice'+i).val(result); 
}); 
setTimeout(function(){ 
    postRequest(i++); 
},1000); 
}