Добавление скроллера в таблицу базы данных уничтожает таблицу - PullRequest
0 голосов
/ 10 апреля 2019

Я хотел бы добавить расширение скроллера в мои данные.Тем не менее, когда я пытаюсь сделать это, вся моя таблица облажается .. Я думаю, что это является причиной обхода в последних строках моего кода JavaScript.

Но это необходимый обходной путь, чтобы вы удвоилиЗаголовки и дочерние строки в таблице.Так что я не могу удалить это.Ребята, вы видите какой-нибудь способ реализации скроллера на этой таблице?

Это мой рабочий стол:

var table;
var groupColumn = 1;

$(document).ready(function() {
  table = $('#contact_overview_table').DataTable( {
    "displayStart": 0,
    "columnDefs": [
      {
        "visible": false,
        "targets": groupColumn
      }
    ],
    "order": [[ groupColumn, 'asc' ]],
    "responsive": {
      "details": {
        "type": 'column',
        "target": 'tr',
        "renderer": function ( api, rowIdx, columns ) {
          var data = $.map( columns, function ( col, i ) {
            return col.hidden ?
              '<tr data-dt-row="'+col.rowIndex+'" data-dt-column="'+col.columnIndex+'">'+
              '<td>'+col.title+':'+'</td> '+
              '<td>'+col.data+'</td>'+
              '</tr>' :
            '';
          } ).join('');

          return data ?
            $('<table/>').append( data ) :
          false;
        }
      }
    },
    "processing": true,
    "ajax": "http://demo3772827.mockable.io/getData",
    "drawCallback": function ( settings ) {
      var api = this.api();
      var rows = api.rows( {page:'current'} ).nodes();
      var last=null;

      api.column(groupColumn, {page:'current'} ).data().each( function ( group, i ) {
        if ( last !== group ) {
          $(rows).eq( i ).before(
            '<tr class="group"><td colspan="15" style="font-weight: bold;">'+group+'</td></tr>'
          );

          last = group;
        }
      } );
    },
    initComplete: function () {
      this.api().columns().every( function () {
        var column = this;
        var select = $('<select><option value=""></option></select>');
        select.appendTo( $(column.header()).empty() )

        select.on( 'click', function(e) {
          e.stopPropagation();
        } );


        select.on( 'change', function () {
          var val = $.fn.dataTable.util.escapeRegex(
            $(this).val()
          );

          column
            .search( val ? '^'+val+'$' : '', true, false )
            .draw();
        } );

        column.data().unique().sort().each( function ( d, j ) {
          select.append( '<option value="'+d+'">'+d+'</option>' )
        } );

        $("#autofocus_on_load > select").focus();
        $('th').removeAttr("tabindex");
      } );
    },
  });

  table.on('draw', function () {
    table.columns().indexes().each( function ( idx ) {
      var select = $(table.column( idx ).header()).find('select');

      if ( select.val() === '' ) {
        select
          .empty()
          .append('<option value=""/>');

        table.column(idx, {search:'applied'}).data().unique().sort().each( function ( d, j ) {
          select.append( '<option value="'+d+'">'+d+'</option>' );
        } );
      }
    } );
  } );

  // Order by the grouping
  $('#contact_overview_table tbody').on( 'click', 'tr.group', function () {
    var currentOrder = table.order()[0];
    if ( currentOrder[0] === groupColumn && currentOrder[1] === 'asc' ) {
      table.order( [ groupColumn, 'desc' ] ).draw();
    }
    else {
      table.order( [ groupColumn, 'asc' ] ).draw();
    }
  } );

  $table = $("#contact_overview_table");
  // workaround for https://github.com/DataTables/Responsive/issues/71
  $table.on('responsive-resize.dt', function(e, datatable, columns) {
    for (var i in columns) {
      var index = parseInt(i, 10) + 1;
      $table.find('th:nth-child(' + index + ')').toggle(columns[i]);
    }
  });
} );
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.19/js/dataTables.bootstrap.min.js"></script>
<script src="https://cdn.datatables.net/responsive/2.2.3/js/dataTables.responsive.min.js"></script>

<link href="https://cdn.datatables.net/responsive/2.2.3/js/dataTables.responsive.min.js" rel="stylesheet" />
<link href="https://cdn.datatables.net/1.10.19/css/dataTables.bootstrap.min.css" rel="stylesheet" />
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />

<table class="table table-striped table-bordered display nowrap" id="contact_overview_table" style="width:100%">
  <thead>
    <tr>
      <th class="text-center" id="autofocus_on_load">Buha Nr.</th>
      <th class="text-center">Art</th>
      <th class="text-center">Anrede</th>
      <th class="text-center">Titel</th>
      <th class="text-center">Vorname</th>
      <th class="text-center">Name</th>
      <th class="text-center">Firma1</th>
      <th class="text-center">Straße</th>
      <th class="text-center">Ort</th>
      <th class="text-center">Mobil</th>
      <th class="text-center table-hide-select">Actions</th>
    </tr>
    <tr>
      <th class="text-center">Buha Nr.</th>
      <th class="text-center">Art</th>
      <th class="text-center">Anrede</th>
      <th class="text-center">Titel</th>
      <th class="text-center">Vorname</th>
      <th class="text-center">Name</th>
      <th class="text-center">Firma1</th>
      <th class="text-center">Straße</th>
      <th class="text-center">Ort</th>
      <th class="text-center">Mobil</th>
      <th class="text-center">Actions</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
  </table>
</body>
</html>

Если я добавлю скроллер, как описано здесь: https://datatables.net/extensions/scroller/examples/initialisation/simple.html

Я получу эту таблицу:

var table;
var groupColumn = 1;

$(document).ready(function() {
  table = $('#contact_overview_table').DataTable( {
    "displayStart": 0,
    "columnDefs": [
      {
        "visible": false,
        "targets": groupColumn
      }
    ],
    "order": [[ groupColumn, 'asc' ]],
    "deferRender": true,
    "scrollY": 200,
    "scrollCollapse": true,
    "scroller": true,
    "responsive": {
      "details": {
        "type": 'column',
        "target": 'tr',
        "renderer": function ( api, rowIdx, columns ) {
          var data = $.map( columns, function ( col, i ) {
            return col.hidden ?
              '<tr data-dt-row="'+col.rowIndex+'" data-dt-column="'+col.columnIndex+'">'+
              '<td>'+col.title+':'+'</td> '+
              '<td>'+col.data+'</td>'+
              '</tr>' :
            '';
          } ).join('');

          return data ?
            $('<table/>').append( data ) :
          false;
        }
      }
    },
    "processing": true,
    "ajax": "http://demo3772827.mockable.io/getData",
    "drawCallback": function ( settings ) {
      var api = this.api();
      var rows = api.rows( {page:'current'} ).nodes();
      var last=null;

      api.column(groupColumn, {page:'current'} ).data().each( function ( group, i ) {
        if ( last !== group ) {
          $(rows).eq( i ).before(
            '<tr class="group"><td colspan="15" style="font-weight: bold;">'+group+'</td></tr>'
          );

          last = group;
        }
      } );
    },
    initComplete: function () {
      this.api().columns().every( function () {
        var column = this;
        var select = $('<select><option value=""></option></select>');
        select.appendTo( $(column.header()).empty() )

        select.on( 'click', function(e) {
          e.stopPropagation();
        } );


        select.on( 'change', function () {
          var val = $.fn.dataTable.util.escapeRegex(
            $(this).val()
          );

          column
            .search( val ? '^'+val+'$' : '', true, false )
            .draw();
        } );

        column.data().unique().sort().each( function ( d, j ) {
          select.append( '<option value="'+d+'">'+d+'</option>' )
        } );

        $("#autofocus_on_load > select").focus();
        $('th').removeAttr("tabindex");
      } );
    },
  });

  table.on('draw', function () {
    table.columns().indexes().each( function ( idx ) {
      var select = $(table.column( idx ).header()).find('select');

      if ( select.val() === '' ) {
        select
          .empty()
          .append('<option value=""/>');

        table.column(idx, {search:'applied'}).data().unique().sort().each( function ( d, j ) {
          select.append( '<option value="'+d+'">'+d+'</option>' );
        } );
      }
    } );
  } );

  // Order by the grouping
  $('#contact_overview_table tbody').on( 'click', 'tr.group', function () {
    var currentOrder = table.order()[0];
    if ( currentOrder[0] === groupColumn && currentOrder[1] === 'asc' ) {
      table.order( [ groupColumn, 'desc' ] ).draw();
    }
    else {
      table.order( [ groupColumn, 'asc' ] ).draw();
    }
  } );

  $table = $("#contact_overview_table");
  // workaround for https://github.com/DataTables/Responsive/issues/71
  $table.on('responsive-resize.dt', function(e, datatable, columns) {
    for (var i in columns) {
      var index = parseInt(i, 10) + 1;
      $table.find('th:nth-child(' + index + ')').toggle(columns[i]);
    }
  });
} );
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.19/js/dataTables.bootstrap.min.js"></script>
<script src="https://cdn.datatables.net/responsive/2.2.3/js/dataTables.responsive.min.js"></script>
<script src="https://cdn.datatables.net/scroller/2.0.0/js/dataTables.scroller.min.js"></script>

<link href="https://cdn.datatables.net/responsive/2.2.3/js/dataTables.responsive.min.js" rel="stylesheet" />
<link href="https://cdn.datatables.net/1.10.19/css/dataTables.bootstrap.min.css" rel="stylesheet" />
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://cdn.datatables.net/scroller/2.0.0/css/scroller.dataTables.min.css" />

<table class="table table-striped table-bordered display nowrap" id="contact_overview_table" style="width:100%">
  <thead>
    <tr>
      <th class="text-center" id="autofocus_on_load">Buha Nr.</th>
      <th class="text-center">Art</th>
      <th class="text-center">Anrede</th>
      <th class="text-center">Titel</th>
      <th class="text-center">Vorname</th>
      <th class="text-center">Name</th>
      <th class="text-center">Firma1</th>
      <th class="text-center">Straße</th>
      <th class="text-center">Ort</th>
      <th class="text-center">Mobil</th>
      <th class="text-center table-hide-select">Actions</th>
    </tr>
    <tr>
      <th class="text-center">Buha Nr.</th>
      <th class="text-center">Art</th>
      <th class="text-center">Anrede</th>
      <th class="text-center">Titel</th>
      <th class="text-center">Vorname</th>
      <th class="text-center">Name</th>
      <th class="text-center">Firma1</th>
      <th class="text-center">Straße</th>
      <th class="text-center">Ort</th>
      <th class="text-center">Mobil</th>
      <th class="text-center">Actions</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
  </table>
</body>
</html>

Буду признателен за любую помощь!С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...