Datatables: невозможно прочитать свойство 'mData' из неопределенного


307

У меня проблема с Datatables. Я также прошел по этой ссылке, которая не дала никаких результатов. Я включил все предпосылки для анализа данных непосредственно в DOM. Пожалуйста, помогите мне решить эту проблему.

скрипт

$(document).ready(function() {
  $('.viewCentricPage .teamCentric').dataTable({
    "bJQueryUI": true,
    "sPaginationType": "full_numbers",
    "bPaginate": false,
    "bFilter": true,
    "bSort": true,
    "aaSorting": [
      [1, "asc"]
    ],
    "aoColumnDefs": [{
      "bSortable": false,
      "aTargets": [0]
    }, {
      "bSortable": true,
      "aTargets": [1]
    }, {
      "bSortable": false,
      "aTargets": [2]
    }],
  });
});

4
Можете ли вы показать HTML вашей таблицы?
Эхсан Саджад

извините за то, что не выложил html .. спасибо за беспокойство .. я исправил мою проблему :).
Тривени

10
Ошибка «Не удается прочитать свойство« mData »с неопределенным значением» также появляется при использовании правильно сформированного thead с colspan, но без второй строки, чтобы получить один th за td
PaulH

запустите, прокомментировав сначала функцию .dataTable (), а затем просмотрите таблицу, в других случаях вы найдете проблему
Rajdeep

столбец thead или заголовок таблицы должен отсутствовать в таблице, поэтому сценарий не может его найти, проверьте заголовок под именем
Rahul Jain

Ответы:


660

FYI dataTables требует хорошо сформированной таблицы. Он должен содержать <thead>и <tbody>теги, иначе выдает эту ошибку. Также убедитесь, что все ваши строки, включая строку заголовка, имеют одинаковое количество столбцов.

Следующее выдаст ошибку (нет <thead>и <tbody>теги)

<table id="sample-table">
    <tr>
        <th>title-1</th>
        <th>title-2</th>
    </tr>
    <tr>
        <td>data-1</td>
        <td>data-2</td>
    </tr>
</table>

Следующее также выдаст ошибку (неравное количество столбцов)

<table id="sample-table">
    <thead>
        <tr>
            <th>title-1</th>
            <th>title-2</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>data-1</td>
            <td>data-2</td>
            <td>data-3</td>
        </tr>
    </tbody>
</table>

Для получения дополнительной информации читайте больше здесь


11
На моем <tbody> был лишний <td>, когда я его убрал, проснулся !!
Большое

3
@SarowerJahan рад, что смог помочь.
Моисей Мачуа

3
Просто потратил целый день на эту проблему. Эта проблема? У меня было 2-е, но 3-е. Пинаю себя в такой глупый вопрос! Спасибо.
IfElseTryCatch

1
@foxontherock, по соглашению это делает. То, что вы описываете, - это настраиваемая конфигурация, о которой я знаю, но если вы не предоставите настраиваемую конфигурацию, то по умолчанию используется соглашение, на которое направлен мой ответ
Моисей Мачуа,

1
Вы, мой друг, ракетист со стальными глазами! У меня пропал <th> :-) :-)
Энди

80

Распространенной причиной Cannot read property 'fnSetData' of undefinedявляется несоответствующее количество столбцов, как в этом ошибочном коде:

<thead>                 <!-- thead required -->
    <tr>                <!-- tr required -->
        <th>Rep</th>    <!-- td instead of th will also work -->
        <th>Titel</th>
                        <!-- th missing here -->
    </tr>
</thead>
<tbody>
    <tr>
        <td>Rep</td>
        <td>Titel</td>
        <td>Missing corresponding th</td>
    </tr>
</tbody>

В то время как следующий код с одним <th>на<td> (количество столбцов должно совпадать) работает:

<thead>
    <tr>
        <th>Rep</th>       <!-- 1st column -->
        <th>Titel</th>     <!-- 2nd column -->
        <th>Added th</th>  <!-- 3rd column; th added here -->
    </tr>
</thead>
<tbody>
    <tr>
        <td>Rep</td>             <!-- 1st column -->
        <td>Titel</td>           <!-- 2nd column -->
        <td>th now present</td>  <!-- 3rd column -->
    </tr>
</tbody>

Ошибка также появляется при использовании правильно сформированного thead с colspan, но без второго ряда.

Для таблицы с 7 столбцами следующее не работает, и мы видим «Не удается прочитать свойство« mData »из undefined» в консоли javascript:

<thead>
    <tr>
        <th>Rep</th>
        <th>Titel</th>
        <th colspan="5">Download</th>
    </tr>
</thead>

Пока это работает:

<thead>
    <tr>
        <th rowspan="2">Rep</th>
        <th rowspan="2">Titel</th>
        <th colspan="5">Download</th>
    </tr>
    <tr>
        <th>pdf</th>
        <th>nwc</th>
        <th>nwctxt</th>
        <th>mid</th>
        <th>xml</th>
    </tr>
</thead>

5
Нашел ваш ответ полезным. В моей разметке не хватало trиспользованного для включения всех thэлементов. Просто оставьте это здесь на случай, если кто-то найдет это полезным!
Викрам Дешмух,

Этот ответ также приведет меня к моему решению. Мне не хватало thстолбца в моем thead, который вызывал ошибку. Ответ Натана Ханны также указывает на эту проблему.
Пол Рихтер

это поможет мне увидеть , что у меня есть не хватает thв моем theadтоже!
Деми Магус

Даже четыре года на colspanинтерпретации - все еще проблема. Я должен был положить некоторые пустые thи нет, colspanчтобы избавиться от ошибок. Но что просто добавить, чтобы получить эту функциональность. Кстати: Rails 5.1.5, Bootstrap 4.0.0. Я просто добавил таблицы стилей и сценарии CDN и $(document).ready…на страницу.
Грег

@ Грег Извините, я не понимаю.
PaulH

43

У меня была та же проблема с использованием данных DOM в представлении Rails, созданном с помощью генератора скаффолдов. По умолчанию представление пропускает <th>элементы для последних трех столбцов (которые содержат ссылки для отображения, скрытия и уничтожения записей). Я обнаружил, что если я добавлю заголовки для этих столбцов в <th>элементе, <thead>то это решит проблему.

Я не могу сказать, если это та же проблема, что у вас, так как я не вижу ваш HTML. Если это не та же проблема, вы можете использовать отладчик chrome, чтобы выяснить, в каком столбце он выдает ошибку, нажав на ошибку в консоли (которая приведет вас к коду, на котором происходит сбой), а затем добавив условное выражение. точка останова (в col==undefined). Когда она останавливается, вы можете проверить переменную, iчтобы увидеть, в каком столбце она находится в данный момент, и которая может помочь вам выяснить, чем отличается этот столбец от других. Надеюсь, это поможет!

ошибка отладки mData


1
Это был единственный метод, который помог мне решить мою проблему. Спасибо!
Майк Кроу,

Не уверен, что вы уже упоминали об этом, но мы можем «посмотреть» переменные в правом столбце и выяснить, к какой таблице относится. В моем случае это рендеринг таблицы Asp.Net по умолчанию, который не стандартизируется, когда таблица пуста. Спасибо за чаевые!
Hoàng Long

Спасибо ... Натан за этапы отладки. Это помогло мне.
Сачин Гайквад

1
Для меня проблема решена добавлением элементов thead и tbody.
neolei

У меня такая же настройка Rails, но я назвал последние три столбца «Подробности», colspan="3"но получил ошибки (вот как я оказался на этой странице). Я немного повозился, но в конце концов сдался и создал три thэлемента с первым «Детали» и оставил последние два пустыми. Вокруг предположили, что у dataTables есть проблемы с colspan как последним в серии. Исправление OP странно в том, что количество столбцов не складывается. У меня не было никаких условий на столе, таких как orderили sortable. Я добавил их после того, как заработал.
Грег

31

Имея <thead>и <tbody>с одинаковыми номерами <th>и <td>решив мою проблему.


1
Спасибо, это тоже была моя проблема. Ваш ответ был полезным, сэр.
fmquaglia

27

Это также может произойти, если у вас есть аргументы таблицы для таких вещей, 'aoColumns':[..]которые не соответствуют правильному количеству столбцов. Подобные проблемы обычно возникают при копировании кода с других страниц, чтобы быстро начать интеграцию таблиц данных.

Пример:

Это не сработает:

<table id="dtable">
    <thead>
        <tr>
            <th>col 1</th>
            <th>col 2</th>
        </tr>
    </thead>
    <tbody>
        <td>data 1</td>
        <td>data 2</td>
    </tbody>
</table>
<script>
        var dTable = $('#dtable');
        dTable.DataTable({
            'order': [[ 1, 'desc' ]],
            'aoColumns': [
                null,
                null,
                null,
                null,
                null,
                null,
                {
                    'bSortable': false
                }
            ]
        });
</script>

Но это будет работать:

<table id="dtable">
    <thead>
        <tr>
            <th>col 1</th>
            <th>col 2</th>
        </tr>
    </thead>
    <tbody>
        <td>data 1</td>
        <td>data 2</td>
    </tbody>
</table>
<script>
        var dTable = $('#dtable');
        dTable.DataTable({
            'order': [[ 0, 'desc' ]],
            'aoColumns': [
                null,
                {
                    'bSortable': false
                }
            ]
        });
</script>

1
Точно моя проблема, только со свойством 'columns'.
Ник Пулос,

@NickPoulos Да, это может произойти с любым параметром конфигурации, если он ссылается на индекс, которого нет в таблице.
DrewT

12

Еще одна причина, по которой это происходит, заключается в параметре columns в инициализации DataTable.

Количество столбцов должно совпадать с заголовками

"columns" : [ {
                "width" : "30%"
            }, {
                "width" : "15%"
            }, {
                "width" : "15%"
            }, {
                "width" : "30%"
            } ]

У меня было 7 колонок

<th>Full Name</th>
<th>Phone Number</th>
<th>Vehicle</th>
<th>Home Location</th>
<th>Tags</th>
<th>Current Location</th>
<th>Serving Route</th>


8

Советы 1:

По этой ссылке вы получите несколько идей:

https://datatables.net/forums/discussion/20273/uncaught-typeerror-cannot-read-property-mdata-of-undefined

Советы 2:

Проверьте правильность следующего:

  • Пожалуйста, проверьте Jquery Vesion
  • Пожалуйста, проверьте версию вашего CDN или локальных файлов данных .min & css, связанных с данными
  • ваш стол имеет <thead></thead>& <tbody></tbody>теги
  • Длина столбцов заголовка таблицы такая же, как длина столбцов тела
  • Ваше использование некоторых облачений style='display:none'одинаково применимо как к заголовку, так и к телу.
  • столбцы вашей таблицы не пустые, используйте что-то вроде [Null, -, NA, Nil]
  • Ваш стол вполне без <td>, <tr>проблем

<thead> </ thead> и <tbody> </ tbody> решают мою проблему. Спасибо.
MrTex

6

в моем случае эта ошибка произошла, если я использую таблицу без заголовка

              <thead>
                   <tr>
                       <th>example</th>
                  </tr>
              </thead>

1
Спасибо - я могу подтвердить, что это исправило мою ошибку этого типа тоже.
Рог

5

Я столкнулся с той же ошибкой, когда пытался добавить colspan к последнему

<table>
  <thead>
    <tr>    
      <th>&nbsp;</th> <!-- column 1 -->
      <th colspan="2">&nbsp;</th> <!-- column 2&3 -->
    </tr>
  </thead>

  <tbody>
    <tr>
      <tr>&nbsp;</tr>
      <tr>&nbsp;</tr>
      <tr>&nbsp;</tr>
    </tr>
  </tbody>
</table>

и решил это, добавив скрытый столбец в конце тр

<thead>
  <tr>    
    <th>&nbsp;</th> <!-- column 1 -->
    <th colspan="2">&nbsp;</th> <!-- column 2&3 -->

    <!-- hidden column 4 for proper DataTable applying -->
    <th style="display: none"></th> 
  </tr>
</thead>

<tbody>
  <tr>
    <tr>&nbsp;</tr>
    <tr>&nbsp;</tr>
    <tr>&nbsp;</tr>

    <!-- hidden column 4 for proper DataTable applying -->
    <tr style="display: none"></tr>
  </tr>
</tbody>

Объяснение этому заключается в том, что по какой-то причине DataTable не может быть применен к таблице с colspan в последнем th, но может быть применен, если colspan используется в любом middle.

Это решение немного хакерское, но проще и короче, чем любое другое решение, которое я нашел.

Я надеюсь, что это поможет кому-то.


3

Немного другая проблема для меня из ответов, приведенных выше. Для меня разметка HTML была в порядке, но один из моих столбцов в javascript отсутствовал и не соответствовал html.

т.е.

<table id="companies-index-table" class="table table-responsive-sm table-striped">

                            <thead>
                            <tr>
                                <th>Id</th>
                                <th>Name</th>
                                <th>Created at</th>
                                <th>Updated at</th>
                                <th>Count</th>
                            </tr>
                            </thead>
                            <tbody>
                            @foreach($companies as $company)
                                <tr>
                                    <td>{{ $company->id }}</td>
                                    <td>{{ $company->name }}</td>
                                    <td>{{ $company->created_at }}</td>
                                    <td>{{ $company->updated_at }}</td>
                                    <td>{{ $company->count }}</td>
                                </tr>
                            @endforeach
                            </tbody>
                        </table>

Мой сценарий: -

<script>
        $(document).ready(function() {
            $('#companies-index-table').DataTable({
                serverSide: true,
                processing: true,
                responsive: true,
                    ajax: "{{ route('admincompanies.datatables') }}",
                columns: [
                    { name: 'id' },
                    { name: 'name' },
                    { name: 'created_at' },
                    { name: 'updated_at' },     <-- I was missing this line so my columns didn't match the thead section.
                    { name: 'count', orderable: false },
                ],
            });
        });
    </script>

3

У меня была динамически сгенерированная, но плохо сформированная таблица с опечаткой. Я скопировал <td>тег внутри другого <td>по ошибке. Количество моих столбцов совпадает. У меня были <thead>и <tbody>теги. Все совпало, за исключением этой маленькой ошибки, которую я некоторое время не замечал, потому что в моей колонке было много ссылок и тегов изображений.


2

Я столкнулся с той же проблемой, но я генерировал таблицу динамически . В моем случае на моем столе отсутствовали <thead>и <tbody>теги.

вот мой фрагмент кода, если это помогло кому-то

   //table string
   var strDiv = '<table id="tbl" class="striped center responsive-table">';

   //add headers
   var strTable = ' <thead><tr id="tableHeader"><th>Customer Name</th><th>Customer Designation</th><th>Customer Email</th><th>Customer Organization</th><th>Customer Department</th><th>Customer ContactNo</th><th>Customer Mobile</th><th>Cluster Name</th><th>Product Name</th><th> Installed Version</th><th>Requirements</th><th>Challenges</th><th>Future Expansion</th><th>Comments</th></tr> </thead> <tbody>';


  //add data
  $.each(data, function (key, GetCustomerFeedbackBE) {
                            strTable = strTable + '<tr><td>' + GetCustomerFeedbackBE.StrCustName + '</td><td>' + GetCustomerFeedbackBE.StrCustDesignation + '</td><td>' + GetCustomerFeedbackBE.StrCustEmail + '</td><td>' + GetCustomerFeedbackBE.StrCustOrganization + '</td><td>' + GetCustomerFeedbackBE.StrCustDepartment + '</td><td>' + GetCustomerFeedbackBE.StrCustContactNo + '</td><td>' + GetCustomerFeedbackBE.StrCustMobile + '</td><td>' + GetCustomerFeedbackBE.StrClusterName + '</td><td>' + GetCustomerFeedbackBE.StrProductName + '</td><td>' + GetCustomerFeedbackBE.StrInstalledVersion + '</td><td>' + GetCustomerFeedbackBE.StrRequirements + '</td><td>' + GetCustomerFeedbackBE.StrChallenges + '</td><td>' + GetCustomerFeedbackBE.StrFutureExpansion + '</td><td>' + GetCustomerFeedbackBE.StrComments + '</td></tr>';
                        });

//add end of tbody
 strTable = strTable + '</tbody></table>';

//insert table into a div                 
   $('#divCFB_D').html(strDiv);
   $('#tbl').html(strTable);


    //finally add export buttons 
   $('#tbl').DataTable({
                            dom: 'Bfrtip',
                            buttons: [
                                'copy', 'csv', 'excel', 'pdf', 'print'
                            ]
                        });

2

В дополнение к несогласованности и числам, это также может быть вызвано отсутствующим элементом в части столбцов датируемых сценариев. Исправление, которое исправило мою строку поиска в datatables.

Я говорю об этой части;

"columns": [
  null,
  .
  .
  .
  null
           ],

Я боролся с этой ошибкой до тех пор, пока мне не указали, что эта часть имеет на единицу меньше «ноль», чем мой общий счет.


2

Это привело меня в бешенство - как успешно отрисовать DataTable в представлении .NET MVC. Это сработало:

 **@model List<Student>
 @{
    ViewData["Title"] = "Index";
}
 <h2>NEW VIEW Index</h2>
 <table id="example" class="display" style="width:100%">
   <thead>
   <tr>
   <th>ID</th>
    <th>Firstname</th>
    <th>Lastname</th> 
  </tr>
  </thead>
  <tbody>
@foreach (var element in Model)
{
    <tr>
    <td>@Html.DisplayFor(m => element.ID)</td>
    <td>@Html.DisplayFor(m => element.FirstName)</td>
    <td>@Html.DisplayFor(m => element.LastName)</td>
    </tr>

}
</tbody>
</table>**

Скрипт в файле JS:

**$(document).ready(function () {
    $('#example').DataTable();
});**

1

В моем случае, используя ASP.NET GridView, UpdatePanel и DropDownList (с плагином Chosen, где я сбрасывал значение до нуля с помощью строки Javascript), я получил эту ошибку и пробовал все без надежды в течение нескольких дней. Проблема заключалась в том, что код моего раскрывающегося списка кода был следующим, и когда я выбираю значение дважды, чтобы применить его действие к выбранным строкам сетки, я получаю эту ошибку. В течение нескольких дней я думал, что это проблема с Javascript (опять же, в моем случае), и, наконец, исправление давало ноль для значения drowpdown в процессе обновления:

  private void ddlTasks_SelectedIndexChanged(object sender, System.EventArgs e)
  {
     if (ddlTasks.SelectedValue != 0) {
        ChangeStatus(ddlTasks.SelectedValue);
        ddlTasks.SelectedValue = "0"; //// **This fixed my issue**
     }

     dvItemsGrid.DataSource = CreateDatasource();
     dvItemsGrid.DataBind();
     dvItemsGrid.UseAccessibleHeader = true;
     dvItemsGrid.HeaderRow.TableSection = TableRowSection.TableHeader;

  }

Это была моя вина:

     $('#<%= DropDownList.ClientID%>').val('0').trigger("chosen:updated").chosen();

0

Вы должны обернуть свои строки <thead>для заголовков столбцов и <tbody>для строк. Также убедитесь, что у вас есть соответствие нет. заголовков столбцов, <th>как вы делаете дляtd


0

Я могу возникнуть из поля aoColumns. Как заявлено ЗДЕСЬ

aoColumns: если указано, длина этого массива должна быть равна количеству столбцов в исходной таблице HTML. Используйте 'null' там, где вы хотите использовать только значения по умолчанию и автоматически определяемые параметры.

Затем вы должны добавить поля, как в столбцах таблицы

...
aoColumnDefs: [
    null,
    null,
    null,
    { "bSortable": false },
    null,
],
...

0

в моем случае причиной этой ошибки является то, что у меня есть 2 таблицы с одинаковым именем с разной структурой таблицы из-за моей привычки копировать и вставлять код таблицы. пожалуйста, убедитесь, что у вас разные идентификаторы для каждой таблицы.

<table id="tabel_data">
    <thead>
        <tr>
            <th>heading 1</th>
            <th>heading 2</th>
            <th>heading 3</th>
            <th>heading 4</th>
            <th>heading 5</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>data-1</td>
            <td>data-2</td>
            <td>data-3</td>
            <td>data-4</td>
            <td>data-5</td>
        </tr>
    </tbody>
</table>

<table id="tabel_data">
    <thead>
        <tr>
            <th>heading 1</th>
            <th>heading 2</th>
            <th>heading 3</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>data-1</td>
            <td>data-2</td>
            <td>data-3</td>
        </tr>
    </tbody>
</table>


-3

Я нашел какое-то «решение».

Этот код не работает:

<table>
<thead>
    <tr>
        <th colspan="3">Test</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td>1</td>
        <td>2</td>
        <td>3</td>
    </tr>
</tbody>

Но это нормально

<table>
<thead>
    <tr>
        <th colspan="2">Test</th>
        <th></th>
    </tr>
</thead>
<tbody>
    <tr>
        <td>1</td>
        <td>2</td>
        <td>3</td>
    </tr>
</tbody>

Я думаю, что проблема в том, что последний TH не может иметь атрибут colspan.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.