Tables de données: impossible de lire la propriété 'mData' de non défini


307

J'ai un problème avec Datatables. J'ai également parcouru ce lien qui n'a donné aucun résultat. J'ai inclus toutes les conditions préalables où j'analyse les données directement dans le DOM. Veuillez m'aider à résoudre ce problème.

Scénario

$(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
pouvez-vous montrer le html de votre table?
Ehsan Sajjad

désolé de ne pas avoir affiché html..merci pour votre préoccupation..j'ai résolu mon problème :).
Thriveni

10
L'erreur "Impossible de lire la propriété 'mData' de non défini" apparaît également lors de l'utilisation d'une tête bien formée avec un colspan mais sans une deuxième ligne pour obtenir une th par td
PaulH

exécutez en commentant d'abord la fonction .dataTable (), puis consultez le tableau, vous trouverez le problème dans plus de cas
Rajdeep

la colonne d'en-tête ou d'en-tête de table doit être manquante dans le tableau, donc le script ne peut pas le trouver, veuillez vérifier votre en-tête sous le nom de la tête ou de la colonne
Rahul Jain

Réponses:


660

FYI dataTables nécessite une table bien formée. Il doit contenir des balises <thead>et <tbody>, sinon il renvoie cette erreur. Vérifiez également que toutes vos lignes, y compris la ligne d'en-tête, ont le même nombre de colonnes.

Ce qui suit générera une erreur (no <thead>et <tbody>tags)

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

Ce qui suit générera également une erreur (nombre inégal de colonnes)

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

Pour plus d'informations, lisez plus ici


11
Il y avait un extra <td> sur mon <tbody> quand je l'ai retiré, il s'est réveillé !! merci beaucoup
Dipen

3
@SarowerJahan heureux d'avoir pu aider.
Moses Machua

3
Je viens de passer une journée entière sur cette question. Le problème? J'avais 2 ème mais 3 td. Me donner un coup de pied à un problème aussi stupide! Merci beaucoup.
IfElseTryCatch

1
@foxontherock, par convention, c'est le cas. Ce que vous décrivez est une configuration personnalisée que je connais, mais si vous ne fournissez pas de configuration personnalisée, il s'agit par défaut de la convention à laquelle ma réponse répond
Moses Machua

1
Vous mon ami êtes un homme de missile aux yeux d'acier! Il me manquait un <th> :-) :-)
Andy

80

Une cause fréquente Cannot read property 'fnSetData' of undefinedest le nombre de colonnes incompatibles, comme dans ce code erroné:

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

Alors que le code suivant avec un <th>par<td> (le nombre de colonnes doit correspondre) fonctionne:

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

L'erreur apparaît également lors de l'utilisation d'une tête bien formée avec un colspan mais sans deuxième rangée.

Pour une table avec 7 colonnes, ce qui suit ne fonctionne pas et nous voyons "Impossible de lire la propriété 'mData' de non défini" dans la console javascript:

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

Pendant que cela fonctionne:

<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
J'ai trouvé votre réponse utile. Mon balisage manquait l' trutilisé pour entourer tous les théléments. Laissez-le ici au cas où quelqu'un trouverait cela utile!
Vikram Deshmukh

Cette réponse m'a également conduit à ma solution. Il me manquait une thcolonne dans mon thead, ce qui provoquait l'erreur. La réponse de Nathan Hanna semble également indiquer ce problème.
Paul Richter

cela m'aide à voir que j'ai un manquant thdans mon theadaussi!
Demi Magus

Même quatre ans d' colspaninterprétation sont toujours un problème. J'ai dû mettre du blanc thet non colspanpour me débarrasser des erreurs. Mais quel simple ajout pour obtenir cette fonctionnalité. BTW: Rails 5.1.5, Bootstrap 4.0.0. Je viens d'ajouter les feuilles de style et les CDN de script, et $(document).ready…à la page.
Greg

@Greg Désolé, je ne comprends pas.
PaulH

43

J'ai eu ce même problème en utilisant les données DOM dans une vue Rails créée via le générateur d'échafaudage. Par défaut, la vue omet les <th>éléments des trois dernières colonnes (qui contiennent des liens pour afficher, masquer et détruire des enregistrements). J'ai trouvé que si j'ajoutais des titres pour ces colonnes dans un <th>élément dans le <thead>, cela corrigeait le problème.

Je ne peux pas dire si c'est le même problème que vous rencontrez car je ne peux pas voir votre html. Si ce n'est pas le même problème, vous pouvez utiliser le débogueur Chrome pour déterminer sur quelle colonne il génère une erreur en cliquant sur l'erreur dans la console (qui vous amènera au code sur lequel il échoue), puis en ajoutant un conditionnel point d'arrêt (at col==undefined). Lorsqu'elle s'arrête, vous pouvez vérifier la variable ipour voir sur quelle colonne elle se trouve actuellement et qui peut vous aider à comprendre ce qui diffère de cette colonne des autres. J'espère que cela pourra aider!

débogage d'une erreur mData


1
C'était la seule méthode qui m'a aidé à résoudre mon problème. Je vous remercie!
Mike Crowe

Je ne suis pas sûr que vous l'ayez déjà mentionné, mais nous pouvons "surveiller" les variables dans la colonne de droite et déterminer quel tableau est lié. Dans mon cas, c'est le rendu par défaut de la table Asp.Net, qui n'est pas standardisé lorsque la table est vide. Merci pour le conseil!
Hoàng Long

Merci ... Nathan pour les étapes de débogage. Ça m'a aidé.
Sachin Gaikwad

1
Pour moi, le problème est résolu en ajoutant l'élément thead et tbody.
neolei

J'ai la même configuration Rails, mais j'avais nommé les trois dernières colonnes "Détails" avec un colspan="3"mais j'ai eu des erreurs (c'est comme ça que je me suis retrouvé sur cette page). J'ai tripoté un peu, mais j'ai finalement abandonné et créé trois théléments et avec le premier "Détails" et laissé les deux derniers vides. Les tripotages suggèrent que dataTables a des problèmes avec colspan comme le dernier de la série. Le correctif OP est étrange dans la mesure où le nombre de colonnes ne correspond pas. Je n'avais aucune condition sur la table, comme orderou sortable. J'ai ajouté ceux-ci après l'avoir fait fonctionner.
Greg

31

Ayant <thead>et <tbody>avec le même nombre de <th>et <td>résolu mon problème.


1
Merci, c'était aussi mon problème. Votre réponse a été utile monsieur.
fmquaglia

27

Cela peut également se produire si vous avez des arguments de table pour des choses comme celles 'aoColumns':[..]qui ne correspondent pas au nombre correct de colonnes. Des problèmes comme celui-ci peuvent généralement se produire lors de la copie de code collé à partir d'autres pages pour démarrer rapidement l'intégration de vos tables de données.

Exemple:

Cela ne fonctionnera pas:

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

Mais cela fonctionnera:

<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
Exactement mon problème, uniquement avec la propriété 'colonnes'.
Nick Poulos

@NickPoulos Oui, cela peut arriver dans n'importe quel paramètre de configuration s'il fait référence à un index qui n'existe pas dans la table.
DrewT

12

Une autre raison pour laquelle cela se produit est à cause du paramètre colonnes dans l'initialisation DataTable.

Le nombre de colonnes doit correspondre aux en-têtes

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

J'avais 7 colonnes

<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

Astuces 1:

Reportez-vous à ce lien, vous obtenez quelques idées:

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

Conseils 2:

Vérifiez que ce qui suit est correct:

  • Veuillez consulter le Jquery Vesion
  • Veuillez vérifier la version de votre CDN ou vos fichiers .min & css locaux liés aux données.
  • ont votre table <thead></thead>et <tbody></tbody>balises
  • Votre table En - tête Colonnes Longueur identique à Corps Colonnes Longueur
  • Votre utilisation de quelques cloumns dans style='display:none'la même propriété s'applique en vous à la fois à l'en-tête et au corps.
  • vos colonnes de table ne sont pas vides, utilisez quelque chose comme [Null, -, NA, Nil]
  • Votre table est bien sans <td>, <tr>problème

<thead> </thead> et <tbody> </tbody> résolvent mon problème. Merci.
MrTex

6

dans mon cas, cette erreur s'est produite si j'utilise une table sans en-tête

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

1
Merci - je peux confirmer que cela a également corrigé mon erreur de ce type.
Rog

5

J'ai fait face à la même erreur, quand j'ai essayé d'ajouter colspan au dernier

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

et l'a résolu en ajoutant une colonne cachée à la fin de 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>

Une explication à cela est que, pour une raison quelconque, DataTable ne peut pas être appliqué à une table avec colspan dans le dernier th, mais peut être appliqué, si colspan est utilisé dans n'importe quel milieu.

Cette solution est un peu hacky, mais plus simple et plus courte que toute autre solution que j'ai trouvée.

J'espère que cela aidera quelqu'un.


3

Problème légèrement différent pour moi des réponses données ci-dessus. Pour moi, le balisage HTML était bien, mais une de mes colonnes dans le javascript était manquante et ne correspondait pas au html.

c'est à dire

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

Mon script: -

<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

J'avais une table générée dynamiquement, mais mal formée avec une faute de frappe. J'ai copié une <td>balise dans une autre <td>par erreur. Mon nombre de colonnes correspondait. J'avais <thead>et des <tbody>balises. Tout concordait, sauf cette petite erreur que je n'ai pas remarquée depuis un moment, car ma colonne contenait beaucoup de balises de liens et d'images.


2

J'avais rencontré le même problème mais je générais la table dynamiquement . Dans mon cas, ma table avait des balises <thead>et manquantes <tbody>.

voici mon extrait de code s'il a aidé quelqu'un

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

En plus de l'incohérence et des nombres, un élément manquant dans la partie des colonnes de scripts datables peut également en être la cause. Correction de la correction de ma barre de recherche de tables de données.

Je parle de cette partie;

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

J'ai eu du mal avec cette erreur jusqu'à ce qu'on m'indique que cette partie avait un «zéro» de moins que mon nombre total de têtes.


2

Celui-ci m'a rendu fou - comment rendre un DataTable avec succès dans une vue .NET MVC. Cela a fonctionné:

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

Script dans le fichier JS:

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

1

Dans mon cas, et en utilisant ASP.NET GridView, UpdatePanel et avec DropDownList (avec le plugin Chosen où je réinitialise la valeur à zéro en utilisant une ligne Javascript), j'ai eu cette erreur et j'ai tout essayé sans espoir pendant des jours. Le problème était que le code de ma liste déroulante dans le code était le suivant et lorsque je sélectionne une valeur deux fois pour appliquer son action aux lignes de grille sélectionnées, j'obtiens cette erreur. J'ai pensé pendant des jours que c'était un problème Javascript (encore une fois, dans mon cas) et finalement le correctif donnait zéro pour la valeur drowpdown avec le processus de mise à jour:

  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;

  }

C'était ma faute:

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

0

Vous devez encapsuler vos lignes <thead>pour les en-têtes de colonne et <tbody>pour les lignes. Assurez-vous également que vous avez le numéro correspondant. des en-têtes de colonne <th>comme vous le faites pour latd


0

Je peux provenir du champ aoColumns. Comme indiqué ICI

aoColumns: si spécifié, la longueur de ce tableau doit être égale au nombre de colonnes dans la table HTML d'origine. Utilisez «null» lorsque vous souhaitez utiliser uniquement les valeurs par défaut et les options détectées automatiquement.

Ensuite, vous devez ajouter des champs comme dans les colonnes du tableau

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

0

dans mon cas, la cause de cette erreur est que j'ai 2 tables qui ont le même nom d'ID avec une structure de table différente, en raison de mon habitude de copier-coller le code de la table. assurez-vous d'avoir un identifiant différent pour chaque table.

<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

J'ai trouvé une "solution".

Ce code ne fonctionne pas:

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

Mais c'est ok:

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

Je pense que le problème est que le dernier TH ne peut pas avoir d'attribut colspan.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.