2013-07-20 26 views
0

所以,我有下面的代碼: -刪除JavaScript警告線停止我追加的代碼工作正常

function testing(results) { 
    $table = $('#formList') 

    for (var event in results) { 
     var formIDX = results[event]["forms_idx"] 
     var formID = results[event]["form_id"] 
     var eventIDX = results[event]["events_idx"] 
     var eventID = results[event]["event_id"] 
     var objID = results[event]["object_id"] 
     var testVal = results[event]["value"] 

alert($table.find("#" + formIDX).find('td:eq(1)').find("div").find("table").html()) 

     $subTable = $table.find("#" + formIDX).find('td:eq(1)').find("div").find("table") 

     var url ="http://localhost:3278/FARTFramework/testScenario/ajaxPopulateSubTables" 

     $.post(url, { 
      formID: formID, eventIDX:eventIDX, eventID:eventID, objID:objID, testVal:testVal 
     }, function(data) { 
      $subTable.append(data); 
     }).done(function(){}); 
    } 
} 

它基本上需要一個JSON文件,然後將數據添加到右邊的分表內的主表通過追加等

奇怪的是在調試過程中,我有一個警報在那裏檢查它所識別的表的HTML(確保它找到了正確的子表等),並且都運行良好。但是如果我刪除了這個警報,它會突然將所有數據追加到主表的最後一個子表中?任何線索?

+2

這就是異步的東西是如何工作的,循環繼續和完成,然後***內容插入ajax,警報只是暫停操作足夠長的時間完成ajax。換句話說,你的邏輯是有缺陷的,在進行下一次迭代之前,你必須等待ajax調用完成(並且請不要將它設置爲async:false)! – adeneo

+0

感謝您對@adeneo的解釋,關於如何實現這一點的任何建議?恐怕我的google-fu已經拋棄了我,我對ajax很陌生(大部分都是真的!) – MorkPork

回答

2

這是一個典型的JavaScript閉環問題。 for循環中定義的變量在循環中每次都被重新分配,並且來自AJAX請求(異步)的響應被附加到最後一個子表。它在你有警報時工作,因爲在AJAX請求完成的時候,變量還沒有被重新分配(因爲警報阻止了for循環的執行)。

你可以通過讓一個函數執行AJAX請求和追加來處理這個問題。變量在這個函數中不會被重新分配,因此應該起作用。

function testing(results) { 
    $table = $('#formList') 

    function appendSubTable(formIDX, formID, eventIDX, eventID, objID, testVal){ 
     alert($table.find("#" + formIDX).find('td:eq(1)').find("div").find("table").html()) 

     var $subTable = $table.find("#" + formIDX).find('td:eq(1)').find("div").find("table") 

     var url ="http://localhost:3278/FARTFramework/testScenario/ajaxPopulateSubTables" 

     $.post(url, { 
      formID: formID, eventIDX:eventIDX, eventID:eventID, objID:objID, testVal:testVal 
     }, function(data) { 
      $subTable.append(data); 
     }).done(function(){}); 
    } 

    for (var event in results) { 
     var formIDX = results[event]["forms_idx"] 
     var formID = results[event]["form_id"] 
     var eventIDX = results[event]["events_idx"] 
     var eventID = results[event]["event_id"] 
     var objID = results[event]["object_id"] 
     var testVal = results[event]["value"] 

     appendSubTable(formIDX, formID, eventIDX, eventID, objID, testVal); 
    } 
} 
+0

似乎很好地做了棘手的事情,歡呼!奇怪的是,我第一次在三人桌的決賽桌上嘗試過兩次輸入時,例如如果對象5和6應該進入決賽桌,它會在5之前放6,但是在第一次之後似乎工作正常!我會留意它,但否則看起來不錯!乾杯! :) – MorkPork

1

沒有看到更多的代碼,我無法肯定地說。但是,當我有類似的問題,這是因爲我正在使用追加我的$(document).ready(function(){ /*stuff here*/ })

本質上我追加到的對象尚未加載。

+0

不幸的是,在這種情況下,我正在做的事情正確,至少從我開始,因爲我的功能被稱爲從一個$(文檔).ready()感謝您的建議,雖然 – MorkPork

0

移動

$subTable = $table.find("#" + formIDX).find('td:eq(1)').find("div").find("table") 

要你的回調函數:

$.post(url, { 
    formID: formID, eventIDX:eventIDX, eventID:eventID, objID:objID, testVal:testVal 
}, function(data) { 
    $subTable = $table.find("#" + formIDX).find('td:eq(1)').find("div").find("table") 
    $subTable.append(data); 
}).done(function(){}); 
+0

可悲的是,這並不工作 – MorkPork

+0

而我剛剛意識到爲什麼。雖然這段代碼阻止了'$ subtable'的繼續,'formIDX'仍然在變化。 – CompanyDroneFromSector7G

+0

好的 - 我明白了。現在編碼... – CompanyDroneFromSector7G

0
在你的Ajax調用使用它的參數 '異步'

;它接受布爾值,在其中傳遞值'false'。

嘗試一下

+0

他不希望它是同步的,當然? – CompanyDroneFromSector7G