0

所以,我有以下代码: -

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(确保它找到了正确的子表等)并且一切正常。但是,如果我删除该警报,它会突然只将所有数据附加到主表中的最后一个子表?!有什么线索吗?

4

4 回答 4

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);
    }
}
于 2013-07-20T11:29:17.813 回答
1

没有看到更多你的代码,我不能肯定地说。但是当我遇到类似的问题时,那是因为我在我的外部使用了 append$(document).ready(function(){ /*stuff here*/ })

基本上我要附加的对象还没有加载。

于 2013-07-20T11:12:45.520 回答
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(){});
于 2013-07-20T11:17:28.360 回答
0

在你的 Ajax 调用中使用它的参数'async';它接受布尔值,在其中传递值“false”。

试试看

于 2013-07-20T11:17:44.127 回答