Dane: Nie można odczytać właściwości „mData” niezdefiniowanej


307

Mam problem z Datatables. Przejrzałem również ten link, który nie przyniósł żadnych rezultatów. Uwzględniłem wszystkie wymagania wstępne, podczas których analizuję dane bezpośrednio w DOM. Uprzejmie pomóż mi rozwiązać ten problem.

Scenariusz

$(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
czy możesz pokazać HTML swojego stołu?
Ehsan Sajjad

przepraszam, że nie opublikowałem html .. dziękuję za troskę .. naprawiłem mój problem :)
Thriveni

10
Błąd „Nie można odczytać właściwości„ mData ”niezdefiniowanego” pojawia się również, gdy używa się dobrze uformowanej thead z kolspanem, ale bez drugiego wiersza, aby uzyskać jedną th na td
PaulH

uruchom najpierw komentując funkcję .dataTable (), a następnie zobacz tabelę, znajdziesz problem w większej liczbie przypadków
Rajdeep

kolumna nagłówka thead lub tabeli musi być niedostępna, więc skrypt nie może jej znaleźć, sprawdź nagłówek pod nazwą thead lub inną nazwą kolumny
Rahul Jain,

Odpowiedzi:


660

FYI DataTables wymaga dobrze uformowany tabeli. Musi zawierać <thead>i <tbody>tagi, w przeciwnym razie zgłasza ten błąd. Sprawdź także, czy wszystkie wiersze, w tym wiersz nagłówka, mają tę samą liczbę kolumn.

Następujące wyrzuci błąd (nie <thead>i <tbody>tagi)

<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>

Następujące spowoduje również zgłoszenie błędu (nierówna liczba kolumn)

<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>

Aby uzyskać więcej informacji, przeczytaj więcej tutaj


11
Na moim <tbody> było dodatkowe <td>, kiedy go usunąłem! wielkie dzięki
Dipen

3
@ SarowerJahan cieszę się, że mogłem pomóc.
Mojżesz Machua

3
Właśnie spędziłem cały dzień na tej kwestii. Problem? Miałem 2, ale 3 td. Kopiąc się w tak głupią sprawę! Dzięki wielkie.
IfElseTryCatch

1
@foxontherock, zgodnie z konwencją. To, co opisujesz, to konfiguracja niestandardowa, o której wiem, ale jeśli nie dostarczysz konfiguracji niestandardowej, domyślnie będzie to konwencja, którą adresują moje odpowiedzi
Mojżesz Machua

1
Ty, mój przyjacielu, jesteś rakietą o stalowych oczach! Brakowało mi <th> :-) :-)
Andy

80

Częstą przyczyną Cannot read property 'fnSetData' of undefinedjest niedopasowana liczba kolumn, jak w tym błędnym kodzie:

<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>

Chociaż działa następujący kod z jednym <th>na<td> (liczba kolumn musi pasować):

<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>

Błąd pojawia się również przy korzystaniu z dobrze uformowanej thead z colspan, ale bez drugiego rzędu.

W przypadku tabeli z 7 kolumnami poniższe polecenie nie działa i widzimy „Nie można odczytać właściwości„ mData ”niezdefiniowanej” w konsoli javascript:

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

Podczas gdy to działa:

<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
Twoja odpowiedź była przydatna. W moim znaczniku brakowało trużytego do zamknięcia wszystkich thelementów. Zostawiam to tutaj na wypadek, gdyby ktoś uznał to za przydatne!
Vikram Deshmukh

Ta odpowiedź doprowadziła mnie również do mojego rozwiązania. Brakowało mi thkolumny thead, która powodowała błąd. Odpowiedź Nathana Hanny również wydaje się wskazywać na tę kwestię.
Paul Richter

to pomaga mi zobaczyć, że thw moim theadteż brakuje.
Demi Magus

Nawet cztery lata colspantłumaczenia ustnego wciąż stanowią problem. Musiałem wstawić jakieś puste thi nie, colspanaby pozbyć się błędów. Ale jaki prosty dodatek, aby uzyskać tę funkcjonalność. BTW: Rails 5.1.5, Bootstrap 4.0.0. Właśnie dodałem arkusze stylów i skrypty CDN oraz $(document).ready…do strony.
Greg

@Greg Przepraszamy, nie rozumiem.
PaulH

43

Miałem ten sam problem przy użyciu danych DOM w widoku Rails utworzonym za pomocą generatora rusztowań. Domyślnie widok pomija <th>elementy trzech ostatnich kolumn (które zawierają łącza do pokazywania, ukrywania i niszczenia rekordów). Odkryłem, że jeśli dodam tytuły dla tych kolumn w <th>elemencie w obrębie <thead>, to naprawi to problem.

Nie mogę powiedzieć, czy masz ten sam problem, ponieważ nie widzę twojego html. Jeśli nie jest to ten sam problem, możesz użyć debugera Chrome, aby dowiedzieć się, w której kolumnie jest on błędny, klikając błąd w konsoli (który przeniesie Cię do kodu, który nie działa), a następnie dodając warunkową punkt przerwania (at col==undefined). Kiedy się zatrzyma, możesz sprawdzić zmienną, iaby zobaczyć, w której kolumnie jest obecnie, co może pomóc Ci dowiedzieć się, co różni się w tej kolumnie od innych. Mam nadzieję, że to pomaga!

błąd debugowania mData


1
To była jedyna metoda, która pomogła mi rozwiązać mój problem. Dziękuję Ci!
Mike Crowe,

Nie jestem pewien, czy już o tym wspomniałeś, ale możemy „obserwować” zmienne w prawej kolumnie i dowiedzieć się, która tabela jest powiązana. W moim przypadku jest to domyślne renderowanie tabeli Asp.Net, która nie jest standaryzowana, gdy tabela jest pusta. Dzięki za wskazówkę!
Hoàng Long

Dziękuję ... Nathan za kroki debugowania. Pomogło mi to.
Sachin Gaikwad,

1
Dla mnie problem został rozwiązany przez dodanie elementu thead i tbody.
neolei

Mam taką samą konfigurację Railsów, ale ostatnie trzy kolumny nazwałem „Szczegóły”, colspan="3"ale dostałem błędy (tak skończyłem na tej stronie). Grzebałem trochę, ale w końcu poddałem się i stworzyłem trzy thelementy, a pierwszy z nich „Szczegóły”, a ostatnie dwa pozostawiłem puste. Szarpanie się wokoło sugerowało, że dataTables ma problemy z colspan jako ostatnim z serii. Poprawka OP jest nieparzysta, ponieważ liczba kolumn się nie sumuje. Nie miałem żadnych warunków na stole, takich jak orderlub sortable. Dodałem je po uruchomieniu.
Greg

31

Mając <thead>i <tbody>przy tej samej liczbie <th>i <td>rozwiązując mój problem.


1
Dzięki, to też był mój problem. Twoja odpowiedź była pomocna.
fmquaglia,

27

Może się to również zdarzyć, jeśli masz argumenty tabeli dotyczące rzeczy, 'aoColumns':[..]które nie pasują do prawidłowej liczby kolumn. Takie problemy mogą często występować podczas kopiowania wklejania kodu z innych stron w celu szybkiego rozpoczęcia integracji danych.

Przykład:

To nie zadziała:

<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>

Ale to zadziała:

<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
Dokładnie mój problem, tylko z właściwością „columns”.
Nick Poulos,

@NickPoulos Tak, może się zdarzyć w dowolnym parametrze konfiguracyjnym, jeśli odwołuje się do indeksu, który nie istnieje w tabeli.
DrewT

12

Jeszcze jeden powód, dla którego tak się dzieje, to parametr kolumny podczas inicjalizacji DataTable.

Liczba kolumn musi być zgodna z nagłówkami

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

Miałem 7 kolumn

<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

Wskazówki 1:

Zapoznaj się z tym linkiem, aby uzyskać kilka pomysłów:

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

Wskazówki 2:

Sprawdź, czy następujące informacje są prawidłowe:

  • Proszę sprawdzić Jquery Vesion
  • Sprawdź wersję swojego CDN lub lokalnych powiązanych plików .min i css
  • twój stół ma <thead></thead>i <tbody></tbody>tagi
  • Twoja tabela Długość nagłówka kolumny jest taka sama jak długość kolumny ciała
  • Twoje Korzystanie z niektórych cloumns w style='display:none' samej własności dotyczy zarówno nagłówka, jak i ciała.
  • kolumny tabeli nie są puste, użyj czegoś takiego jak [Null, -, NA, Nil]
  • Twój stół jest jeden bez <td>, <tr>problemu

<thead> </thead> i <tbody> </tbody> rozwiązują mój problem. Dzięki.
MrTex

6

w moim przypadku ten błąd wystąpił, jeśli korzystam z tabeli bez nagłówka

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

1
Dzięki - mogę potwierdzić, że to również naprawiło mój błąd tego typu.
Rog

5

Napotkałem ten sam błąd, gdy próbowałem dodać colspan do ostatniego th

<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>

i rozwiązał to, dodając ukrytą kolumnę na końcu tr

<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>

Wyjaśnienie tego jest takie, że z jakiegoś powodu DataTable nie może być zastosowana do tabeli z colspan w ostatnim, ale może być zastosowana, jeśli colspan jest używany w jakimkolwiek środkowym.

To rozwiązanie jest nieco zuchwałe, ale prostsze i krótsze niż jakiekolwiek inne rozwiązanie, które znalazłem.

Mam nadzieję, że to komuś pomoże.


3

Nieco inny problem dla mnie od odpowiedzi podanych powyżej. Dla mnie znaczniki HTML były w porządku, ale brakowało jednej z moich kolumn w javascript i nie pasowało do html.

to znaczy

<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>

Mój skrypt: -

<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

Miałem dynamicznie generowany, ale źle sformatowany stół z literówką. Przez pomyłkę skopiowałem <td>tag w innym <td>. Moja liczba kolumn jest dopasowana. Miałem <thead>i <tbody>tagi. Wszystko pasowało, z wyjątkiem tego małego błędu, którego nie zauważyłem przez pewien czas, ponieważ moja kolumna zawierała wiele tagów linków i obrazów.


2

Napotkałem ten sam problem, ale generowałem tabelę Dynamicznie . W moim przypadku brakowało mojego stołu <thead>i<tbody> znaczników.

oto mój fragment kodu, jeśli komuś pomógł

   //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

Oprócz niespójności i liczb, może to również powodować brak elementu w kolumnie kolumn skryptów danych. Korekta, która naprawiła pasek wyszukiwania moich danych.

Mówię o tej części;

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

Walczyłem z tym błędem, dopóki nie wskazałem, że ta część ma o jeden „zero” mniej niż moja całkowita liczba thead.


2

Ten doprowadził mnie do szału - jak z powodzeniem renderować DataTable w widoku .NET MVC. To działało:

 **@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>**

Skrypt w pliku JS:

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

1

W moim przypadku i używając ASP.NET GridView, UpdatePanel i DropDownList (z wtyczką Chosen, w której resetuję wartość do zera za pomocą wiersza Javascript), dostałem ten błąd i próbowałem wszystkiego bez nadziei na kilka dni. Problem polegał na tym, że kod mojego menu rozwijanego w kodzie był następujący i kiedy wybieram wartość dwukrotnie, aby zastosować jej akcję do wybranych wierszy siatki, pojawia się ten błąd. Przez kilka dni myślałem, że to problem z Javascriptem (znowu, w moim przypadku), a na koniec poprawka dawała zero dla wartości drowpdown w procesie aktualizacji:

  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;

  }

To była moja wina:

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

0

Musisz zawinąć wiersze w <thead>nagłówki kolumn i <tbody>wiersze. Upewnij się również, że masz pasujące nr. nagłówków kolumn, <th>jak w przypadkutd


0

Mogę pochodzić z pola aoColumns. Jak stwierdzono TUTAJ

aoColumns: Jeśli określono, długość tej tablicy musi być równa liczbie kolumn w oryginalnej tabeli HTML. Użyj „null”, jeśli chcesz używać tylko wartości domyślnych i automatycznie wykrywanych opcji.

Następnie musisz dodać pola jak w tabeli Kolumny

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

0

w moim przypadku przyczyną tego błędu jest to, że mam 2 tabele o tym samym identyfikatorze z inną strukturą tabeli, z powodu mojego zwyczaju kopiowania i wklejania kodu tabeli. upewnij się, że masz inny identyfikator dla każdej tabeli.

<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

Znalazłem jakieś „rozwiązanie”.

Ten kod nie działa:

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

Ale to jest w porządku:

<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>

Myślę, że problem polega na tym, że ostatni TH nie może mieć atrybutu colspan.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.