datatables jquery - 未捕获的类型错误:无法读取未定义的属性“显示”

Posted

技术标签:

【中文标题】datatables jquery - 未捕获的类型错误:无法读取未定义的属性“显示”【英文标题】:datatables jquery - Uncaught TypeError : CAnnot read property 'show' of undefined 【发布时间】:2015-11-26 02:03:56 【问题描述】:

谁能帮我找出下面代码的问题。

我正在尝试做的事情: 使用 jquery/datatables,我试图显示特定行的附加数据(使用 ajax 调用检索)。

数据表定义代码为:

$(window).load(function() 
var table = $('#table_id').DataTable(
    //"font-size" : 2em,
    "columnDefs" : [ 
        className : "details-control",
        "targets"  : [1],
        "orderable" : false ,
        
        "targets" : [2,6],
        "width" : "25%",
        className : "dt-left",
         
        "targets" : [3,4,5,7],
        "width" : "10%",
        className : "dt-center"
        ]
   ); 
   // Add event listener for opening and closing details
   $('#table_id').on('click', 'td.details-control', function () 
       var tr = $(this).closest('tr');
       var row = table.row( tr );

       if ( row.child.isShown() ) 
       //This row is already open - close it
           row.child.hide();
           tr.removeClass('shown');
        
        else 
        //Open this row
            row.child(formatx(row.data())).show();
            tr.addClass('shown');
        

);

);

formatx函数和回调函数分别是:

    function printd(data) 
            var pdata = '';
            for(var i in data.careGivers)
                pdata = pdata + '<tr>'+
                    '<td>Parent: </td>'+
                    '<td>'+data.careGivers[i].ParentName+'</td>'+
                    '</tr>';
                
                pdata =  '<table cellpadding="3" cellspacing="0" border="0" style="padding-left:50px;">'+pdata+
        '</table>';
                alert(pdata);
                return pdata;
            

function formatx(d) 

    var val = d[0];
    $.ajax(
        url : "<?php echo site_url('Sclass/get_wl_details_ajax/')?>/"+val,
        dataType:'json',
        success : printd
    );

我得到的错误(因为没有显示数据,我假设)是:

【问题讨论】:

formatx(row.data()) 返回 json,对吗? @DelightedD0D - 是的,这是正确的。已验证 可以显示格式吗? example here 似乎表明 row.child().show() 需要 html,仍在查看文档以查看是否接受 json printd函数返回一个html字符串,这是我期望show函数处理的。 【参考方案1】:

目前,您的函数formatx(d) 调用printd(data),它创建html 并将其返回给formatx(d) formatx(d) 不返回任何内容。

您需要将结果返回给row.child(formatx(row.data())).show(); 调用。此外,您的 formatx() 使用 ajax 调用,这意味着返回的值不会立即可用,因此您的逻辑必须考虑到这一点。

我能想到的方法至少有 2 种(更多,而且可能更好)。

方法一

通过您的函数链传递row,然后仅在逻辑末尾调用row.child(someData).show();,如下所示:

  // Add event listener for opening and closing details
 $('#table_id').on('click', 'td.details-control', function () 
     var tr = $(this).closest('tr');
     var row = table.row(tr);

     if (row.child.isShown()) 
         //This row is already open - close it
         row.child.hide();
         tr.removeClass('shown');
      else 
         //Open this row
         formatx(row) // just pass row to the format function here
         tr.addClass('shown');
     

 );

 function formatx(row) 
     var val = row.data()[0]; //slight change here
     $.ajax(
         url: "<?php echo site_url('Sclass/get_wl_details_ajax/')?>/" + val,
         dataType: 'json',
         success: function (response)  // change this callback to return the result
             return printd(response,row);
         
     );
 

function printd(data,row) 
     var pdata = '';
     for (var i in data.careGivers) 
         pdata = pdata + '<tr>' +
             '<td>Parent: </td>' +
             '<td>' + data.careGivers[i].ParentName + '</td>' +
             '</tr>';
     
     pdata = '<table cellpadding="3" cellspacing="0" border="0" style="padding-left:50px;">' + pdata +
         '</table>';
     alert(pdata);
     row.child(formatx(row.data(pdata))).show();
 

方法2

将所有功能合并到一个块中,让 ajax 成功回调为您处理问题,类似这样(如果您不需要从代码中的其他地方调用这些函数,这会更简洁一些):

 // Add event listener for opening and closing details
  $('#table_id').on('click', 'td.details-control', function () 
      var tr = $(this).closest('tr');
      var row = table.row(tr);

      if (row.child.isShown()) 
          //This row is already open - close it
          row.child.hide();
          tr.removeClass('shown');
       else 
          var val = row.data()[0]; 
          $.ajax(
              url: "<?php echo site_url('Sclass/get_wl_details_ajax/')?>/" + val,
              dataType: 'json',
              success: function (data) 
                  var pdata = '';
                  for (var i in data.careGivers) 
                      pdata = pdata + '<tr>' +
                          '<td>Parent: </td>' +
                          '<td>' + data.careGivers[i].ParentName + '</td>' +
                          '</tr>';
                  
                  pdata = '<table cellpadding="3" cellspacing="0" border="0" style="padding-left:50px;">' + pdata +
                      '</table>';
                  alert(pdata);
                  row.child(row.data(pdata)).show();
                  tr.addClass('shown');
              
          );
      
  );

【讨论】:

你为什么在第二种方法中再次调用formatxrow.child(formatx(row.data(pdata))).show(); @user5249203 只是忘记在第二个示例中更新该行。更新为row.child(row.data(pdata)).show();ty 感谢您的快速更新。您的解决方案很有帮助。 方法二:row.child(row.data(pdata)).show();替换为 row.child(pdata).show();

以上是关于datatables jquery - 未捕获的类型错误:无法读取未定义的属性“显示”的主要内容,如果未能解决你的问题,请参考以下文章

jQuery DataTables:未捕获的 TypeError:无法读取未定义的属性“mData”

jQuery Datatables 错误(未捕获的 TypeError:$ 不是函数)

未捕获的类型错误:无法读取 JQuery DataTable 未定义的属性“mData”

未捕获的TypeError:无法读取未定义数据表的属性“长度”

获取未捕获的类型错误 DataTable() 不是函数

jQuery DataTables 错误 - TypeError:无法读取未定义的属性“fnInit”