Javascript 尝试在ajax外部访问dataTable变量会导致未定义错误

Javascript 尝试在ajax外部访问dataTable变量会导致未定义错误,javascript,jquery,ajax,datatables,Javascript,Jquery,Ajax,Datatables,我有一个jquery自动完成功能,一旦选择了一个值,它就会从ajax调用加载一个带有复选框的数据表。然后,在提交表单时,我需要访问datatable变量来迭代每一行以获得所选的行,但是datatable变量显示为未定义 我的操作与示例中的相同,唯一的区别是数据来自Ajax请求 你能帮我理解为什么会这样吗 $document.readyfunction{ 坎皮德变种; var t_OmnitureCode; //活动输入自动完成 $campaign.autocomplete{ 来源:functio

我有一个jquery自动完成功能,一旦选择了一个值,它就会从ajax调用加载一个带有复选框的数据表。然后,在提交表单时,我需要访问datatable变量来迭代每一行以获得所选的行,但是datatable变量显示为未定义

我的操作与示例中的相同,唯一的区别是数据来自Ajax请求

你能帮我理解为什么会这样吗

$document.readyfunction{ 坎皮德变种; var t_OmnitureCode; //活动输入自动完成 $campaign.autocomplete{ 来源:functionrequest,response{ $.ajax{ 网址:推广, 类型:GET, 数据:{ 期限:request.term, 行动:搜索运动 }, 数据类型:json, 成功:functiondata{ if!data.length{ var结果=[{ 标签:未找到匹配项, 值:-1 }]; 应答结果; }否则{ 响应$.mapdata,functionitem{ 返回{ 标签:item.name, 值:item.campaid } }; } } }; }, 选择:functionevent,ui{ 违约事件; campId=ui.item.value; 如果campId!=-1{ this.value=ui.item.label; //这将应用从Ajax调用获取内容的数据表 t_OmnitureCode=applyDataTableOmnitureCodecampId; } }, 焦点:functionevent,ui{ 违约事件; this.value=ui.item.label; } }; //处理表格提交 $frm_promotion.onsubmit,functione{ var form=此; //下面未定义datatable t_OmnitureCode的变量 var rows_selected=t_OmnitureCode.column0.checkbox.selected; 编辑: 刚刚意识到,即使在分配变量t_OmnitureCode=applyDataTableOmnitureCodecampId时,它仍然是未定义的,不知道为什么

以下是applyDataTableOmnitureCode代码:

function applyDataTableOmnitureCode(campId) {
    $("#tbl_omnitureCode").DataTable({
        destroy: true, 
        scrollX: true,                                      
        fixedColumns: {
            leftColumns: 1
        },
        "ajax": {
            "url": "promotion",
            "type": "GET",
            "data": {
                action: "searchOmnitureCodesByCampaignId",
                campaignId: campId
            },
            "dataSrc": ""
        },                  
        "columns": [                        
            { "data": "key" },
            { "data": "omnitureCode" },
            { "data": "urlAppName" },
            { "data": "language" },
            { "data": "channel" },
            { "data": "createDateTime", "defaultContent": "" },
            { "data": "updateDateTime", "defaultContent": "" }
        ],
        "columnDefs": [                     
            { "targets": 0, "checkboxes": { "selectRow": true } }
        ],
        "select": {
            "style": "multi"
        },
        "order": [[1, "asc"]],
        "fnInitComplete": function() {
            $("#omnitureCodeSection").show();
        }
    });
};

这是一个范围问题:在$document.ready函数中声明变量表。 您可能希望将其置于全局范围之外:

var表

$document.readyfunction{ table=$'example'.DataTable{ ...
};

在使用DataTables对象之前,您可能需要将DataTables对象捕获到一个变量中:

var t_OmnitureCode = $("#tbl_omnitureCode").DataTable();
var rows_selected = t_OmnitureCode.column(0).checkboxes.selected();
顺便说一句,使用外部ajax调用填充DataTable的方法是次优的。有一个选项可以用于此目的,您可以指定所有必要的参数,更好地与DataTables API集成,并获得更好的性能,因为您不需要在每次刷新时销毁和创建DataTable


您只需在需要刷新表数据时触发即可。

我也尝试过,但没有成功。在那里,应该可以,因为变量可用于处理表单提交部分。很抱歉,如果我没有得到您需要的信息,ApplyDataTableOmnitureCode不会返回任何内容…@KevinB您完全正确,big我没有看到的错误。谢谢你抓住了这个机会。这是当之无愧的否决票。@KevinB请回答,这样我就可以给你我正在做的销毁:因为无法重新初始化datatable错误,所以我按照中的建议做了:https://stackoverflow.com/questions/24545792/cannot-reinitialise-datatable-dynamic-data-for-datatableAnd 就是一个非常糟糕的建议,而不是将文章的OP指向根本原因使用外部ajax调用填充数据表,而不是使用本机选项ajax。建议的解决方法可以消除后果,而不是根本原因,使用API方法会损害应用程序性能,并导致与您类似的进一步问题。没有工作ries:这是当之无愧的。现在解决我问题的是KevinB的评论,如果他没有给出答案,我不能将其标记为答案。如果你的意思是你已经将.DataTable输出分配给变量,并将其返回到applyDataTableOmnitureCodecampId主体中,那么自从你在每次需要使用该变量时,都要创建表,而不是像我上面建议的那样使用本机getter,并且只要在ajax调用成功时调用函数即可。