【问题标题】:jQuery DataTable data disappears after sortingjQuery DataTable 数据排序后消失
【发布时间】:2016-11-30 16:03:42
【问题描述】:

我不确定为什么我的数据表中的数据在排序后会消失。

从用户点击提交按钮后触发的 jQuery 开始:

 $('#searchSubmit').on('click', function()
 {
   var searchbooking = $('#searchbooking').val();
   var searchbol = $('#searchbol').val();

   $.post('api/search.php', {searchbooking: searchbooking, searchbol: searchbol}, function(data)
   {
     var obj = JSON.parse(data);
     $('#tableBody').empty(); 
     var htmlToInsert = obj.map(function (item)
     {
       return '<tr><td>'+item.BOL_DATE+'</td><td>'+ item.BOOKING_NUM +'</td></tr>';
     });
     $('#tableBody').html(htmlToInsert.join(''));
   });
 });

这是我第一次使用 SQLSRV 编码的 PHP 脚本(我可能会添加):

 <?php
 if($_POST['searchbooking'] == true || $_POST['searchbol'] == true)
 {
   $_SESSION['where'] = "";
   $searchbooking = stripslashes(str_replace( "'", "''", $_POST['searchbooking']));
   $searchbol = stripslashes(str_replace( "'", "''", $_POST['searchbol']));

   if($searchbooking != "")
   {
     if( $_SESSION['where'] != "" ) $_SESSION['where'] .= " AND ";
     $_SESSION['where'] = "[BOOKING_NUM] = '".$searchbooking."'";
   }
   if($searchbol != "")
   {
     if( $_SESSION['where'] != "" ) $_SESSION['where'] .= " AND ";
     $_SESSION['where'] .= "[BOL_NUM] = '".$searchbol."'";
   }

   $where = "WHERE " . $_SESSION['where'];

   $select = "SELECT [BOL_DATE], [BOOKING_NUM] FROM [brokerage].[dbo].[detailbackup] ".$where."";

   $query = sqlsrv_query($dbc, $select);

   $out = array();
   while( $row = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC) ) 
   {
     $out[] = $row;
   }
   echo json_encode($out);  
 ?>

回到我的 HTML 页面,表格是这样设置的:

 <table class='table table-striped table-bordered table-hover display nowrap' id='example1' cellspacing="0" width="100%">
 <thead>
   <tr>
     <th>Bol Date</th>
     <th>Booking Number</th>
   </tr>
 </thead>
 <tbody id="tableBody">
 </tbody>
 </table>

在 HTML 页面底部附近,在结束 body 标记上方,我有用于格式化 DataTable 的 JavaScript:

 <script type="text/javascript">
   $('#example1').DataTable({
     "iDisplayLength": 25,
     "scrollX": true,
     "scrollY": 550,
     "order": [[ 0, "desc" ]],
     "bLengthChange": true,  
     "bSort": true,   
     "bAutoWidth": true   
 </script>

使用上面添加的所有内容,我可以将数据返回到页面。但是一旦我排序(甚至将表的长度从 25 更改为 50),数据就会消失。

有人看到我的错误吗?

【问题讨论】:

    标签: javascript php jquery html datatables


    【解决方案1】:

    htmlToInsert = obj.map(...)htmlToInsert 转换为一个数组,因此您需要使用.join() 将其转换回字符串:

    $('#tableBody').html(htmlToInsert.join(''));
    

    其次,您没有在$.post 调用中指定数据类型。根据the docs,第四个参数是:

    服务器预期的数据类型。默认值:智能猜测(xml、json、脚本、文本、html)。

    让 jQuery 猜测可能会使您自己对 JSON.parse 的调用失败,因为 data 很可能已经是一个对象。

    去掉这个风险,把数据类型放在$.post的第四个参数里:

    }, 'json');
    

    并删除对JSON.parse 的调用,如下所示:

    obj = data;
    

    【讨论】:

    • - 更新我的代码无济于事。排序后数据仍然消失。有什么想法吗?
    • 您能恢复问题中的更改吗?您的更改使我的答案看起来很愚蠢。同时我会检查...
    • 检查console.log(data); 提供的内容,然后再执行JSON.parse。你确定它是一个 JSON 字符串并且还没有被解析为一个对象吗?您是否使用 console.log 调试过您的代码?
    • trincot - 感谢您的建议。我试图利用您提供的代码,但最后,我无法让它工作。但是,我能够在下面使用 davidkonrad 的答案。无论如何,我赞成你的回答和回应。再次感谢您。
    • 感谢您的反馈! ;-)
    【解决方案2】:

    您不能以这种方式向 dataTables 添加新行;你必须通过API。您只是在 DOM 表中插入新行,而不是 dataTables 内部,这就是为什么在排序(或过滤等)时行似乎消失的原因。将 dataTable 实例保存在全局变量中:

    table = $('#example1').DataTable({
      "iDisplayLength": 25,
      ...
    })
    

    现在重写整个 $.post 以使用 API 而不是 jQuery DOM 操作:

    $.post('api/search.php', {searchbooking: searchbooking, searchbol: searchbol}, function(data) {
    
       table.clear() //clear content
    
       var obj = JSON.parse(data);
    
       obj.forEach(function(item) { //insert rows
         table.row.add([item.BOL_DATE, item.BOOKING_NUM])
       })
    
       table.draw() //update display
    })
    

    【讨论】:

    • davidkonrad - 谢谢你,先生。我已经更新了我的代码以匹配您的答案,现在一切正常。有趣的是 - 我也遇到了标题与表格主体未对齐的问题。您的代码回答了一个我什至不必问的问题。谢谢。
    • davidkonrad - 我刚刚发现排序不再有效。有什么想法吗?
    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多