2013-08-20 93 views
1

在以下示例變量e包含選擇框中所有選定的客戶端,我將它們在for循環中逐個迭代,並通過jQuery的get方法傳遞它們根據客戶端的值,但for循環在get方法結束之前執行,並且由於它改變了val(下一個值)的值。如何解決這個問題?在執行get方法之前執行的JavaScript for循環

var e = document.getElementById("client"); 
for (var i = 0; i < e.options.length; i++) { 
    if (e.options[i].selected) { 
     var val = e.options[i].value; 
     alert(val); // here it is coming normally 

     $('#fund').append('<option value=' + select.options.length + '>---' + val + '----</option>'); 
     $.get("listFundsForClient", { client: val }, function(data) { 
      alert("2nd:" + val);// here it is taking next value due to for loop iteration 
     }); 
    } 
} 
+4

因爲'$ .get()'是一個異步方法 –

+0

爲什麼java標籤? – Marc

+0

[AJAX 25:17](http://www.reddit.com/r/ProgrammerHumor/comments/1klgf6/ajax_2517/) – Paul

回答

1

可以使用$.ajax()同步做它撥打電話,這樣的:

$.ajax({ 
    url: myUrl, 
    async: false, 
    data: myData, 
    success: function(data) { 
    //stuff 
    } 
}); 
2

這是因爲這裏val是一個閉包變量,它可以重新寫爲

$('#client option:selected').each(function(){ 
    var $this = $(this), val =$this.val(); 
    alert(val); // here it is coming normally 

    $('#fund').append('<option value='+select.options.length+'>---'+val+'----</option>'); 
    $.get("listFundsForClient", {client: val}, function(data) { 
     alert("2nd:"+val);// here it is taking next value due to for loop iteration 
    }); 
}) 
+0

可以請你解釋我做了什麼,或只是給我一些鏈接來引用。 – b22

+0

閱讀關於變量範圍和關閉https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures和https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope –

+0

@adityasingh我也使用jQuery選擇器來獲取選擇的選項,而不是純JavaScript,因爲它是更少的代碼 –