jQuery 数据表 ajax 回调

Posted

技术标签:

【中文标题】jQuery 数据表 ajax 回调【英文标题】:jQuery datatables ajax callback 【发布时间】:2011-12-01 19:35:27 【问题描述】:

我正在使用 jQuery DataTables 并处理服务器端数据。当 ajax 调用返回时,我试图调用一个函数。我尝试插入这个fnCallback2,它调用我的函数和原始函数,但是 jQuery 只是抛出一个错误(并且没有告诉我错误是什么)并跳过。

$("#brands").dataTable( 
"bServerSide" : true,
"sAjaxSource" : "ajax.php",
"fnServerData" : function(sSource, aoData, fnCallback) 
    fnCallback2 = function(a,b,c)
        fnCallback.call(a,b,c);
        update_editable();
    ;
    $.ajax( 
        "dataType" : 'json',
        "type" : "POST",
        "url" : sSource,
        "data" : aoData,
        "success" : fnCallback2
    ););

我也尝试添加 fnInitComplete 参数,但它只会在第一次被调用,而不是在后续页面之后。

"fnInitComplete": function()
update_editable();
,

如何在 ajax 请求后正确调用我的代码,以便同时调用原始回调?

【问题讨论】:

【参考方案1】:

另一种选择是使用在每次绘制事件后调用的fnDrawCallback。这将在每个 ajax 请求之后完成。

"fnDrawCallback" : function() 
    update_editable();

【讨论】:

这就像一个魅力!但是它每次都会触发像 jQueryUI 对话框这样的 AJAX 函数,所以想在这里分享一下,如果你要绑定一个函数,首先需要取消绑定事件才能工作.. IE: "fnDrawCallback": function() $("#ask_container" ).find('a[href^="includes/view"].t3_txt').unbind("click"); $("#ask_container").find('a[href^="includes/view"].t3_txt').on("click",function(b)b.preventDefault(); var ce=$(this ).attr("href"); ...你的函数的其余部分在这里! 密钥(以前是 fnDrawCallback)现在是 drawCallback(从 1.10 开始)。此外,该函数接收settings 对象作为第一个参数。 @basic6 虽然文档说settings 对象不是可选的,但不传递任何内容也可以。知道为什么/如何? @Sterex:什么都没通过? DataTables 将该设置对象传递给您的回调。是否使用它取决于您。【参考方案2】:

试试这个方法:

"fnServerData": function ( sSource, aoData, fnCallback ) 
       /* Add some extra data to the sender */
       aoData.push(  "name": "more_data", "value": "my_value"  );
       $.ajax( 
         "dataType" : 'json',
         "type" : "POST",
         "url" : sSource,
         "data" : aoData,
         "success" : function(json) 
           /* Do whatever additional processing you want on the callback, 
             then tell DataTables */
           fnCallback(json)
        );

然后,您可以在 fnCallback(json); 行之前做任何您想做的事情 - 包括调用函数。

【讨论】:

我看过了,但它强制执行 GET,我可能会将大量数据传回服务器。我想坚持使用 POST。 @BobBaddeley 更新了我的答案 - 未经测试 经过测试,还是不行。它看起来等同于我在原始问题中发布的内容。不过,谢谢。【参考方案3】:

解决方案

在 DataTables 1.10 中,有多种方法可以处理 Ajax 完成事件。

使用ajax.dataSrc 选项:

var table = $("#example").DataTable(
     serverSide: true,
     ajax: 
         url: "/test/0",
         dataSrc: function(d)

             // TODO: Insert your code

             return d.data;    
         
     
);

使用xhr事件:

$("#example").on('xhr.dt', function(e, settings, json, xhr)
    // TODO: Insert your code
);

var table = $("#example").DataTable(
     serverSide: true,
     ajax: 
         url: "/test/0"
     
);

使用xhr 事件与ajax.dataSrc 选项相比还有一个额外的优势:

从 DataTables 1.10.7 开始,此事件在 Ajax 请求完成时由成功和错误条件触发(即,无论 Ajax 请求的结果如何,它总是被触发)。

演示

有关代码和演示,请参阅 this jsFiddle。

【讨论】:

【参考方案4】:

试试这个:

"fnServerData": function ( sSource, aoData, fnCallback ) 
    $.getJSON( sSource, aoData, function (json)  
       fnCallback(json)
).complete(function()update_editable(););

【讨论】:

以上是关于jQuery 数据表 ajax 回调的主要内容,如果未能解决你的问题,请参考以下文章

jQuery ajax() 参数,回调函数,数据类型,发送数据到服务器,高级选项

jQuery ajax() 参数,回调函数,数据类型,发送数据到服务器,高级选项

jquery.Ajax回调成功后数据赋值给全局变量的问题

jQuery AJAX

jQuery.ajax() 成功/失败回调何时调用?

jquery通过ajax方法获取json数据不执行success