web-dev-qa-db-fra.com

"Uncaught TypeError: impossible d'utiliser l'opérateur 'in' pour rechercher 'longueur' dans" déclenché par le plugin Datatables et jQuery 1.11.3

J'utilise le plugin jQuery Datatables pour permettre la pagination, le tri et la recherche avec mes tables. Les éléments apparaissent mais ne fonctionnent pas et la pagination ne se présente que parfois. Je reçois le message d'erreur dans la console Chrome:

Uncaught TypeError: Cannot use 'in' operator to search for 'length' in 

Voici la page de démonstration.

J'utilise Bootstrap à côté de ce plugin.

20
James

Cette erreur est due à la méthode isArraylike dans la version 1.11.3 de jQuery. (seulement). La méthode ressemble à ceci 

function isArraylike( obj ) {

    // Support: iOS 8.2 (not reproducible in simulator)
    // `in` check used to prevent JIT error (gh-2145)
    // hasOwn isn't used here due to false negatives
    // regarding Nodelist length in IE
    var length = "length" in obj && obj.length, // <------ THIS IS THE CULPRIT
        type = jQuery.type( obj );

    .......
}

Cette version de jQuery utilisait "length" dans object pour obtenir la longueur. (Je n'en sais rien).

Mais je sais qu'aucune autre version de jquery n'a ce problème.

Les versions 1.11.3 et 2.1.4 (comme James l’a souligné dans les commentaires) présentent ce problème.

La solution serait donc simplement de passer à la version suivante ou d’utiliser au moins une version autre que 1.11.3 ou 2.1.4

33
Dhiraj

Je travaille sur Ruby on Rails avec gem jquery-datatables-Rails.

Je mets à jour la gemme directement à partir du dernier commit sur GitHub:

gem 'jquery-datatables-Rails', github: "rweng/jquery-datatables-Rails", branch: "master"

Ce travail pour moi, je suppose qu’ils publieront bientôt une nouvelle version de la gemme avec ce commit.

8
Alex

La mise à niveau de DataTables vers DataTables 1.10.7 ou 1.10.8-dev ne fonctionnait pas pour moi (avec jQuery 1.11.3).

La mise à niveau vers jQuery 1.11.2 a fonctionné (avec DataTables 10.0.0)

5
Benjamin Crouzier

Bien que n'étant pas lié à DataTables, je suis tombé sur l'erreur "impossible à utiliser dans l'opérateur pour rechercher une longueur". C’est le principal résultat de Google pour l’erreur. Je souhaitais simplement publier mon problème en guise de réponse au cas où cela aiderait quelqu'un d’autre.

J'ai eu:

ApplicationIDs: $.map(".application-checkbox:checked", function (checkedApplicationCheckbox, i) {

J'avais oublié d'emballer mon sélecteur avec le $. Le correctif était donc de m'assurer que je transmettais les éléments jQuery réels comme premier argument à map et pas simplement une chaîne ...

ApplicationIDs: $.map($(".application-checkbox:checked"), function (checkedApplicationCheckbox, i) {

Je suis presque gêné de poster ceci;)

À votre santé

3
bgs264

Pas besoin de déclasser jQuery. J'ai résolu la même erreur en utilisant aoColumns comme

$('#id').DataTable( {
    data: [["A", "B"], ["a", "b"]],
    'aoColumns': [ 
        { sWidth: "50%", bSearchable: false, bSortable: false }, 
        { sWidth: "50%", bSearchable: false, bSortable: false }
        ],
    } );

J'utilise jQuery 2.1.4 et DataTables 1.10.9

3
raghavsood33

J'ai corrigé un problème similaire en ajoutant le type de données json comme suit:

$.ajax({
    type: "POST",
    url: "someUrl",
    dataType: "json",
    data: {
        varname1 : "varvalue1",
        varname2 : "varvalue2"
    },
    success: function (data) {
        $.each(data, function (varname, varvalue){
            ...
        });  
    }
});

Et dans mon contrôleur, je devais utiliser des guillemets doubles autour de chaînes telles que (remarque: elles doivent être échappées en Java):

@RequestMapping(value = "/someUrl", method=RequestMethod.POST)
@ResponseBody
public String getJsonData(@RequestBody String parameters) {
    // parameters = varname1=varvalue1&varname2=varvalue2
    String exampleData = "{\"somename1\":\"somevalue1\",\"somename2\":\"somevalue2\"}";
    return exampleData;
}
2
LeHill

J'avais exactement le même problème mais la version jQuery n'était pas le coupable pour moi. Dans mon cas, je sérialisais le formulaire de manière incorrecte. Le code a fini avec cette erreur était:

$('#form_name').serialize()

Alors que j'aurais dû l'utiliser.

$('#form_name').serializeArray()

Je l'ai fait et mon problème a été résolu. 

Je viens de jeter ce petit morceau que j'ai ignoré. Pourrait aider quelqu'un.

1
Vishal

Avec DataTables et en appelant un script PHP avec AJAX, sachez que vous devez simplement afficher votre tableau à la fin. Il n'est pas nécessaire de l'encoder d'abord sur un objet JSON avec json_encode.

Alors 

header('Content-type:application/json;charset=utf-8'); 
echo $myArray // This will do. Do not use echo json_encode($myArray);
exit();

Sinon, vous pourriez vous retrouver avec la terrible erreur 

Uncaught TypeError: impossible d'utiliser l'opérateur 'in' pour rechercher 'longueur' dans

ou celui-ci

Uncaught TypeError: Impossible de lire la propriété 'longueur' de non définie

0
RWC