<!DOCTYPE html>
<html>
  <head>
    <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
    <link href="https://nightly.datatables.net/css/jquery.dataTables.css" rel="stylesheet" type="text/css" />
    <script src="https://nightly.datatables.net/js/jquery.dataTables.js"></script>
    <meta charset=utf-8 />
    <title>DataTables - JS Bin</title>
  </head>
  <body>
    <div class="container">
      <table id="example" class="display nowrap" width="100%">
        <thead>
            <tr>
                <th></th>
                <th>Name</th>
                <th>Position</th>
                <th>Office</th>
                <th>Salary</th>
            </tr>
        </thead>
        <tfoot>
            <tr>
                <th></th>
                <th>Name</th>
                <th>Position</th>
                <th>Office</th>
                <th>Salary</th>
            </tr>
        </tfoot>
      </table>
    </div>
  </body>
</html>
 
body {
  font: 90%/1.45em "Helvetica Neue", HelveticaNeue, Verdana, Arial, Helvetica, sans-serif;
  margin: 0;
  padding: 0;
  color: #333;
  background-color: #fff;
}
td.details-control {
    background: url('https://www.datatables.net/examples/resources/details_open.png') no-repeat center center;
    cursor: pointer;
}
tr.shown td.details-control {
    background: url('https://www.datatables.net/examples/resources/details_close.png') no-repeat center center;
}
td.details-control1 {
    background: url('https://www.datatables.net/examples/resources/details_open.png') no-repeat center center;
    cursor: pointer;
}
tr.shown td.details-control1 {
    background: url('https://www.datatables.net/examples/resources/details_close.png') no-repeat center center;
}
 
 
$(document).ready(function() {
    var table = $('#example').DataTable( {
      ajax: function (data, callback, settings) {
              $.ajax({
                url: "/ajax/objects.txt",
              }).then ( function(json) {
                var data = JSON.parse(json);
                callback(data);            
         
              });
      },
      pageLength: 5,
        columns: [
            {
                "className":      'details-control',
                "orderable":      false,
                "data":           null,
                "defaultContent": ''
            },
            { "data": "name" },
            { "data": "position" },
            { "data": "office" },
            { "data": "salary" }
        ],
        order: [[1, 'asc']],
        initComplete: function () {
          init = false;
        },
          createdRow: function ( row, data, index ) {
            if (data.extn === '') {
              var td = $(row).find("td:first");
              td.removeClass( 'details-control' );
            }
           },
          rowCallback: function ( row, data, index ) {
            //console.log('rowCallback');
           }
    } );
     
    // Add event listener for opening and closing first level childdetails
    $('#example tbody').on('click', 'td.details-control', function () {
        var tr = $(this).closest('tr');
        var row = table.row( tr );
        var rowData = row.data();
      
        //get index to use for child table ID
        var index = row.index();
        console.log(index);
 
        if ( row.child.isShown() ) {
            // This row is already open - close it
            row.child.hide();
            tr.removeClass('shown');
        }
        else {
            // Open this row
            row.child( 
               '<table class="child_table" id = "child_details' + index + '" cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">'+
               '<thead><tr><th></th><th>Name</th><th>Position</th><th>Extn</th></tr></thead><tbody>' +
                '</tbody></table>').show();
          
         var childTable = $('#child_details' + index).DataTable({
            ajax: function (data, callback, settings) {
              $.ajax({
                url: "/ajax/objects.txt",
              }).then ( function(json) {
                var data = JSON.parse(json);
                data = data.data;
                
                var display = [];
                //for (d = 0; d < data.length; d++) {
                //  if (data[d].position == rowData.position) {
                //    display.push(data[d]);
                //  }
                //}
                callback({data: data});
         
              });
          },
        columns: [
            {
                "className":      'details-control1',
                "orderable":      false,
                "data":           null,
                "defaultContent": ''
            },
            { "data": "name" },
            { "data": "position" },
            { "data": "extn" },
        ],
            destroy: true,
            scrollY: '100px'
          });
            tr.addClass('shown');
        }
          
 
          
    // Add event listener for opening and closing second level child details
    $('.child_table tbody').off().on('click', 'td.details-control1', function () {
        var c_tr = $(this).closest('tr');
        var c_row = childTable.row( c_tr );
 
        if ( c_row.child.isShown() ) {
            // This row is already open - close it
            c_row.child.hide();
            c_tr.removeClass('shown');
        }
        else {
            // Open this row
            c_row.child( 
               '<table id = "child_details_2" cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">'+
               '<thead><tr><th>Name</th><th>Start Date</th></tr></thead><tbody>' +
                '</tbody></table>').show();
          
         $('#child_details_2').DataTable({
            ajax: function (data, callback, settings) {
              $.ajax({
                url: "/ajax/objects.txt",
              }).then ( function(json) {
                var data = JSON.parse(json);
                data = data.data;
                
                var display = [];
                for (d = 0; d < data.length; d++) {
                  if (data[d].name == rowData.name) {
                    display.push(data[d]);
                  }
                }
                callback({data: display});
         
              });
        },
        columns: [
            { "data": "name" },
            { "data": "start_date" },
        ],
            destroy: true,
            scrollY: '100px'
          });
            c_tr.addClass('shown');
        }
    } );
    } );
          
          
          
          
} );
Output 300px

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
anonymouspro
0viewers