2015-03-31 84 views
0

我正在使用Javascript发送Ajax请求到php页面。For循环在Javascript函数中无法正常工作

我的主要目标是向PHP页面发送ajax请求并获得我已经完成的响应。

问题是,当Ajax发回响应的JavaScript无法正确地发送到HTML。

看看我的代码,以便您可以清楚地理解。

Javascript code: 

function get_rental_fee(){ 
     var count_model = $('#count_model').val(); 
     for(var i =0; i < count_model; i++){ 

     var hours = $('#hours').val(); 
     var modelid = $('#modelid_multi'+i).val(); 
     var get_tax = $('#get_tax_multi'+i).val(); 
     var get_counter = $('#get_counter_multi'+i).val(); 
     var myData = "hours="+hours+"&modelid="+modelid+"&get_tax="+get_tax; 

    jQuery.ajax({ 

      type: "POST", // Post/Get method 

      url: "get_rental_fee.php", //Where form data is sent on submission 

      dataType:"text", // Data type, HTML, json etc. 

      data:myData, //Form variables 

      success:function(response){ 


       var result = response.split('|'); 

         document.getElementById('rental_price_multi'+i).value=result[0]; 
        document.getElementById('tax_multi'+i).value=result[1]; 


     }, 




      error:function (xhr, ajaxOptions, thrownError){ 

       //On error, we alert user 

       alert(thrownError); 

      } 

      }); 

     } 

    } 

的问题是在这里:

document.getElementById('rental_price_multi'+i).value=result[0]; 
         document.getElementById('tax_multi'+i).value=result[1]; 

循环运行3次,PHP是送我回响应3次。但在Javascript中,Theses 2行仅显示第3次的值而不是第1次和第2次。 但我收到所有3次的回复。

此外,当我运行代码的JavaScript返回一个错误:

Uncaught Type Error: Cannot set Property 'value' of null 

请帮我在哪里,我做错了

+0

很常见的问题 - 只要我找到合适的重复问题就会关闭 – Alnitak 2015-03-31 10:13:59

+0

你能帮我吗? – user2226181 2015-03-31 10:16:05

+0

嗨Sachin, 我是新来的Javascript和Ajax你能告诉我我在哪里覆盖?我怎样才能将每一个响应都发送给HTML?我想在html中显示数值。我有多个输入类型相同的名称,但在HTML中有不同的ID,所以我需要一个循环 – user2226181 2015-03-31 10:20:27

回答

1

问题是$就默认为异步:真正的,所以循环中的值i在到达success时不是所需的值。 你可以简单地让AJAX同步:

$.ajax({ 
    async: false, 
    ... 
}) 

编辑:

如果您仍然希望它是异步,您需要使用瓶盖。

for(var i =0; i < count_model; i++){ 
    (function(i){// closure `i` 
    $.ajax({ 
     type: "POST", 
     ... 
    }); 
    })(i);//<-- for loop `i` 
} 
+0

Arvind,你是宝石..非常棒,谢谢你的帮助。这真的很棒。 – user2226181 2015-03-31 10:22:52

+0

是的,我这样做,但它是说,我将不得不等待3分钟接受它,大声笑 – user2226181 2015-03-31 10:25:00

+0

不,使用'async:false'是** ABSOLUTELY NOT **正确的答案。我有真正的工作要做,所以现在不能回答。 – Alnitak 2015-03-31 10:31:57

0

您的问题是回调里面的i不再具有它在注册回调时的值。这是一个很常见的问题。

一个常见的解决方案是“关闭之上”可变i,因而其保留正确的值:

success: (function(i) { 
    return function(response) { 
     var result = response.split('|'); 
     document.getElementById('rental_price_multi'+i).value=result[0]; 
     document.getElementById('tax_multi'+i).value=result[1]; 
    })(i) 

外函数传递i作为参数,在这在内回调指向它的值功能变得固定。