删除Javascript警报行会阻止我的追加代码正常工作

时间:2013-07-20 11:02:34

标签: javascript jquery append alert

所以,我有以下代码: -

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 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:1)

如果没有看到更多代码,我无法肯定地说。但是当我遇到类似的问题时,因为我在$(document).ready(function(){ /*stuff here*/ })

之外使用追加

基本上我附加的对象尚未加载。

答案 2 :(得分: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(){});

答案 3 :(得分:0)

在Ajax调用中

使用其参数'async';   它接受布尔值,在其中传递值'false'。

试试吧