2014-02-11 23 views
0

我有這個簡單的JavaScript函數,使POST請求和抓取答覆,然後將元素的HTML設置爲答覆。下面是函數:Javascript簡單的功能工作,但不是在循環運行時

function updateStatus(vmid) { 
    action = 'vmstatuslabel'; 
    label = $('#status-'+vmid); 
    $.post(site + '/application/controllers/ajax.php', {action:action, vmid:vmid}, function(data) { 
     console.log(data); 
     label.html(data); 
    }); 
} 

該做這樣的事情updateStatus(13)時,卻多次運行它將只會更新表中的最後一個元素工作正常。下面是該腳本標籤呼應表:

 <?php 
      if($uvms = $vmhandler->userVMs()) { 
       # User has some VMs 
       ?> 
        <table class="table table-condensed table-striped"> 
         <?php 
          foreach($uvms as $vm) { 
           ?> 
            <tr> 
             <td><a href="<?=$site;?>/manage?vid=<?=$vm['id'];?>"><?=$vm['name'];?></a></td> 
             <td><?=$vmhandler->renderControls($vm['id']);?></td> 
             <td id="status-<?=$vm['id'];?>">Test</td> 
             <td><?=$vm['ipaddr'];?></td> 
            </tr> 
           <?php 
           $vmid = $vm['id']; 
           echo "<script>updateStatus($vmid)</script>"; 
          } 
         ?> 
        </table> 

下表中的最後一個元素都有其地位科拉姆更新到任何給updateStatus函數返回的元素但其餘保持爲「測試」。

即使這樣的事情不工作:

function updateStatus(vmid) { 
    action = 'vmstatuslabel'; 
    label = $('#status-'+vmid); 
    $.post(site + '/application/controllers/ajax.php', {action:action, vmid:vmid}, function(data) { 
     console.log(data); 
     label.html("ABCD"); 
    }); 
} 

只有在表中的最後一個元素被設置爲ABCD。

然而,這不工作,和更新每個值ABCD:

function updateStatus(vmid) { 
     label = $('#status-'+vmid); 
      label.html("ABCD"); 
    } 

回答

1

問題是在方法的變量聲明(操作/標籤),聲明爲局部變量的方法,否則這將被視爲全球一次,並通過後續調用作出會影響以前的調用修改也

function updateStatus(vmid) { 
    var action = 'vmstatuslabel'; 
    var label = $('#status-' + vmid); 
    $.post(site + '/application/controllers/ajax.php', { 
     action: action, 
     vmid: vmid 
    }, function (data) { 
     console.log(data); 
     label.html("ABCD"); 
    }); 
} 

假設你調用該方法將VMID = 1,那麼標籤將$('#status-' + 1)和Ajax請求被髮送,但在此之前ajax請求是s如果您再次使用vmid = 2調用該方法,現在爲label = $('#status-' + 2);,並且因爲變量label是全局變量(在沒有var的情況下聲明),則該變量的值將在全局範圍內修改。現在,第一個Ajax請求已完成,並在您使用的回撥方法中使用label,但它指的是$('#status-' + 2)而不是$('#status-' + 1)

+0

我愛你,你能告訴我爲什麼我必須這樣做嗎?所以我不會再犯錯誤了? – user3180103

+0

@ user3180103我會嘗試添加更多解釋 –

+0

我明白了,所以我應該對動作變量進行相同的操作嗎?使它在每種方法的本地?因爲有時「動作請求」可能需要10-15秒才能完成,而用戶可能會在第一個動作還在繼續時運行另一個動作請求。 – user3180103