Подтвердить что ты не робот

JQuery DataTables - медленное инициирование, стандартная таблица html, показанная в начале

Я использую плагин jQuery DataTable, но у меня возникла проблема, когда загрузка скриптов, кажется, занимает некоторое время, поэтому моя веб-страница всегда отображает обычную таблицу html, а в конце концов script, таблица будет затем перейдите в DataTable. Я не думаю, что такая внешность приемлема, поэтому я надеюсь получить здесь несколько советов. могу ли я сделать скрипты быстрее или не показывать переднюю панель? Кстати, я вызываю свой script из частичного представления _Scripts на мой тег _Layout.cshtml head

 @Html.Partial("_Scripts") 

(ОБНОВЛЕНИЕ) Я попытался скрыть таблицу и показать ее после инициализации datatable, однако, я получаю datatable без заголовка таблицы. Любая идея, почему это происходит?

$('#stocktable').hide();
// Initialize data table
    var myTable = $('#stocktable').dataTable({

        // Try styling
        "sScrollX": "100%",
        "sScrollXInner": "100%",
        "bScrollCollapse": true,

        // To use themeroller theme
        "bJQueryUI": true,
        // To use TableTool plugin
        "sDom": 'T<"clear">lfrtip',
        // Allow single row to be selected
        "oTableTools": {
            "sRowSelect": "single"
        },
        "fnInitComplete": function () {
            $('#stocktable').show();
        }
4b9b3361

Ответ 1

[edit to add: Этот старший ответ относится к предыдущему API DataTables. Параметры jQueryUI устарели, а рекомендации для замены находятся здесь: https://datatables.net/manual/styling/jqueryui Кроме того, fnInitCallback (как и все другие варианты) снизил венгерскую нотацию и теперь initCallback]

Оригинальный ответ следует:


Мое предостережение заключается в том, что я не знаком с частичными представлениями _Scripts, поэтому ниже приведен следующий совет: я хотел бы дать кому-то просто включение и вызов JavaScript в "нормальном" виде:

  • Создайте обычную таблицу HTML, чтобы она имела тот же внешний вид, что и final. Если у вас включен jQuery UI (bJQueryUI: true), это означает, что классы jQuery UI в таблице "plain" вместо ожидания добавления DT.

  • Используйте различные методы FOUC (flash of nonlyled content), чтобы скрыть таблицу, пока она не будет готова к рендерингу. API DataTables имеет полезные обратные вызовы, которые вы можете использовать для части "показать это сейчас", например, fnInitCallback. Самый простой (но доступный для удобства) метод - это стиль таблицы с дисплеем: none, а в обратном вызове используйте $('#myTable').show() или некоторые варианты. Поиск в Интернете должен обеспечить отличные решения, которые сохраняют доступность.

Кроме этого, это действительно просто вопрос (как вы говорите!) толерантности к "приемлемому". Мы используем обработку на стороне сервера (возвращаем гораздо меньше записей), загрузчик script для более быстрого времени загрузки script (мы экспериментируем с head.js, но есть и другие!) И минимальные версии скриптов. Даже при этом мы иногда видим простой стол на мгновение, прежде чем он станет DT, но так как интернет-пользователи привыкли видеть, что страницы "создаются" перед их глазами при загрузке элементов, это был приемлемый компромисс. Для вас это может быть не так.

Удачи!

Ответ 2

Я сделал очень простое решение, которое отлично работает. В инициализации DataTable я использовал метод show():

$(document).ready(function() {
    $('#example').dataTable({
        "order": [[ 0, 'asc' ]]
    });
    $('#example').show();
} );

... и в таблице HTML я помещаю дисплей стиля: none:

<table id="example" class="display" cellspacing="0" width="100%" style="display:none">

Удачи!

Ответ 3

У меня была та же проблема. Попробуйте следующее:

var dTable=$("#detailtable").dataTable({
        "bProcessing":true,
        "bPaginate":false,
        "sScrollY":"400px",
        "bRetrieve":true,
        "bFilter":true,
        "bJQueryUI":true,
        "bAutoWidth":false,
        "bInfo":true,
        "fnPreDrawCallback":function(){
            $("#details").hide();
            $("#loading").show();
            //alert("Pre Draw");
        },
        "fnDrawCallback":function(){
            $("#details").show();
            $("#loading").hide();
            //alert("Draw");
        },
        "fnInitComplete":function(){
            //alert("Complete");
        }

Ответ 4

Основываясь на предложении @hanzolo - вот мой комментарий в качестве ответа (и как выглядит мой dataTable):

var stockableTable = $('#stockable').dataTable({
      "bLengthChange": false,
      "iDisplayLength": -1,
      "bSort": false,
      "bFilter": false,
      "bServerSide": false,
      "bProcessing": false,
      "sScrollY": "500px",
      "sScrollX": "95%",
      "bScrollCollapse": true,
      // The following reduces the page load time by reducing the reflows the browser is invoking
      "fnPreDrawCallback":function(){
          $("#loading").show();
      },
      "fnDrawCallback":function(){
      },
      "fnInitComplete":function(){
          $("#details").show();
          this.fnAdjustColumnSizing();
          $("#loading").hide();
      }
  });

Ответ 5

Мое рабочее решение - "грязный" трюк, чтобы скрыть таблицу, не используя "display: none" . Обычный стиль "display: none" вызывает проблему инициализации для таблиц данных jQuery.

Прежде всего, поместите таблицу данных в обертку div:

<div id="dataTableWrapper" style="width:100%" class="dataTableParentHidden">
...data table html as described in jQuery Data Table documentation...
</div>

В CSS:

.dataTableParentHidden {overflow:hidden;height:0px;width:100%;}

Это решение скрывает таблицу данных без использования "display: none" .

После инициализации таблицы данных вам нужно удалить класс из оболочки, чтобы открыть таблицу:

$('#yourDataTable').DataTable(...);
$('#dataTableWrapper').removeClass('dataTableParentHidden');

Ответ 6

Я думаю, вы, вероятно, должны просто загружать скрипты в _Layout.cshtml, после всего этого для чего. Частичные представления действительно предназначены для сегментов, которые могут быть повторно использованы в других областях или, по крайней мере, для отображения содержимого HTML.

Сказав это, нужно просто скрыть стол, пока он не загрузит или даже не скроет его, и не покажет индикатор прогресса.

Вы можете сделать что-то вроде:

// .loadTable() is some function that loads your table and returns a bool indicating it finished
//  just remember to check this bool within the function itself as it will be called over and over until it returns true

while (!loadTable()) {

    // maybe show a progress bar

    if ($('#myTable').css('display') != 'none')) {
        $('#myTable').hide();    // if it isn't already hidden, hide it
    }  
}

// hide progress bar
$('#myTable').show();

UDPATE:

Если плагин таблицы jQuery имеет "успешный" или "завершенный" обратный вызов, просто спрячьте таблицу при загрузке страницы и покажите ее, когда она загрузится.

$(document).ready(function () {
    $('#myTable').hide();

    // run plugin and .show() on success or finished 
});

Ответ 7

Я знаю, это очень старый вопрос, но, возможно, я могу помочь кому-то в будущем, как узнать... Поэтому после многих часов я нахожу единственное решение, которое работает для меня (таблица будет загружена после того, как она будет завершена):

      <html>
                <head>
                    <style>
                    .dn {
                         display: none;
                    }
                </style>
                </head>
                <body>
                        <div id="loadDiv" class="firstDivClass secondDivClass">Loading...<div>
                        <table id="myTable" class="dn firstTableClass secondTableClass">
                             <tr><td>Something Here</td></tr>
                        </table>
                </body>


            <script>
         $(document).ready(function(){
    showMeTheTabel();
    });        
    function shoMeTheTable() {
            var dTable = $('#myTable').dataTable({
                "aoColumnDefs": [
                   {bla, bla}
                ],
                "oLanguage": {
                    "bla" : "bla"
                },
                "fnPreDrawCallback":function(){
                },
                "fnDrawCallback":function(){
                    $("#loading").addClass('dn'); 
                    $('#tabel').removeClass('dn');
                },
                "fnInitComplete":function(){
                    console.log("Complete")           // optional and Done !!!
                }
            });
    }
    </script>
     </html>

Ответ 8

Это связано с плагином ColVis. удалите "W" из sDOM, и ваша рендеринг таблицы будет летать (выпадающие списки albiet withou)

Ответ 9

  • Ниже приведен пример руля node.js. Однако вы можете визуализировать данные, используя любую веб-интерфейсную среду, которую вы используете.
  • Если вы используете начальную загрузку, вы можете сначала скрыть таблицу, используя скрытый класс, или, альтернативно, скрыть элементы вручную.
  • Затем в обратном вызове initComplete вы можете использовать jQuery, чтобы удалить скрытый класс, чтобы отобразить таблицу только после полной загрузки.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
<link href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css" rel="stylesheet">

<table id="stocktable" class="table hidden">
<thead>
  <tr>
    <th>Name</th>
    <th>Last Name</th>
    <th>Age</th>
    <th>Street Address</th>
    <th>State</th>
    <th>Country</th>
  </tr>
</thead>
<tbody>
  {{#each devices}}
    <tr id="{{id}}">
      <td>{{first_name}}</td>
      <td>{{last_name}}</td>
      <td>{{age}}</td>
      <td>{{street_address}}</td>
      <td>{{state}}</td>
      <td>{{country}}</td>
    </tr>
  {{/each}}
</tbody>
</table>

<script>
  $(document).ready(function() {
    $('#stocktable').DataTable({
      columns: [{
          person: 'first_name'
        }, {
          person: 'last_name'
        },
        {
          person: 'age'
        },
        {
          person: 'street_address'
        },
        {
          person: 'state'
        },
        {
          person: 'country'
        }
      ],
      initComplete: function() {
       // Unhide the table when it is fully populated.
       $("#stocktable").removeClass("hidden");
      }
    });
  });
</script>

Ответ 10

Мой datatable прыгал между сообщениями из-за фильтра сверху.

Простое решение: Скройте таблицу с дисплеем: none, затем используйте jquery.fadeIn() перед вызовом DataTable().