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.
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
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.
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
)
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é
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
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;
}
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.
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