web-dev-qa-db-de.com

"Nicht gefundener TypeError: Kann 'in' Operator nicht verwenden, um nach 'length' in" zu suchen ", ausgelöst durch das Datatables Plugin und jQuery 1.11.3

Ich verwende das jQuery-Datatables-Plugin, um das Seitenumbruch, Sortieren und Suchen mit meinen Tabellen zu ermöglichen. Die Elemente werden angezeigt, funktionieren aber nicht, und die Paginierung erscheint nur manchmal. In der Chrome-Konsole wird der Fehler angezeigt:

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

Hier ist die Demo-Seite.

Ich benutze Bootstrap neben diesem Plugin.

20
James

Dieser Fehler ist auf die Methode isArraylike in jQuery Version 1.11.3 zurückzuführen. (nur). Die Methode sieht so aus 

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

    .......
}

Diese Version von jQuery verwendete "length" im Objekt, um die Länge zu ermitteln. (Ich weiß gar nichts darüber).

Aber ich weiß, dass keine andere Version von Jquery dieses Problem hat.

Die Versionen 1.11.3 und 2.1.4 (wie James in den Kommentaren darauf hingewiesen hat) haben dieses Problem.

Die Lösung wäre also, einfach auf die nächste Version zu aktualisieren oder zumindest eine andere Version außer 1.11.3 oder 2.1.4 zu verwenden

33
Dhiraj

Ich arbeite an Ruby on Rails mit Gem Jquery-Datatables-Rails.

Ich aktualisiere den Gem direkt vom letzten Commit auf GitHub:

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

Ich denke, dass diese Arbeit für mich bald eine neue Version des Edelsteins mit diesem Commit veröffentlichen wird.

8
Alex

Das Upgrade auf DataTables auf DataTables 1.10.7 oder 1.10.8-dev hat bei mir nicht funktioniert (mit jQuery 1.11.3).

Downgrade auf jQuery 1.11.2 hat funktioniert (mit DataTables 10.0.0)

5

Obwohl ich nichts mit DataTables zu tun hatte, stieß ich auf diesen Fehler "Kann nicht in Operator verwendet werden, um nach Länge zu suchen". Dies war das Hauptergebnis von Google für den Fehler. Ich wollte nur mein Problem als Antwort posten, falls es anderen hilft.

Ich hatte:

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

Ich hatte vergessen, meinen Selector mit dem $ zu umwickeln, um sicherzustellen, dass die jQuery-Elemente als erstes Argument an map übergeben werden und nicht nur eine Zeichenfolge ...

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

Ich bin fast peinlich, dies zu posten;)

Prost

3
bgs264

Es ist nicht notwendig, jQuery herunterzurüsten. Ich habe den gleichen Fehler mit aoColumns as gelöst

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

Ich verwende jQuery 2.1.4 und DataTables 1.10.9

3
raghavsood33

Ein ähnliches Problem wurde behoben, indem der Json-Datentyp wie folgt hinzugefügt wurde:

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

Und in meinem Controller musste ich doppelte Anführungszeichen für alle Strings verwenden (Anmerkung: Sie müssen in Java mit Escape-Zeichen versehen werden):

@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

Ich hatte genau das gleiche Problem, aber die jQuery-Version war nicht der Schuldige für mich. In meinem Fall wurde das Formular falsch serialisiert. Der Code endete mit diesem Fehler:

$('#form_name').serialize()

Während ich hätte verwenden sollen.

$('#form_name').serializeArray()

Ich habe das gemacht und mein Problem wurde gelöst. 

Ich habe dieses kleine Stück einfach weggeworfen, das ich ignoriert habe. Könnte jemandem da draußen helfen.

1
Vishal

Beachten Sie bei DataTables und dem Aufruf eines PHP-Skripts mit AJAX, dass Sie am Ende nur echo Ihr Array angeben müssen. Es ist nicht erforderlich, es zuerst mit json_encode in ein JSON-Objekt zu codieren.

So 

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

Andernfalls erhalten Sie möglicherweise den schrecklichen Fehler 

Nicht gefundener TypeError: Der Operator 'in' kann nicht zur Suche nach 'length' in verwendet werden

oder dieses

Uncught TypeError: Eigenschaft 'length' von undefined kann nicht gelesen werden

0
RWC