"Uncaught TypeError: Cannot use 'in' operator to search for 'length' in " triggered by Datatables plugin and jQuery 1.11.3

"Uncaught TypeError: Cannot use 'in' operator to search for 'length' in " triggered by Datatables plugin and jQuery 1.11.3

我正在使用 jQuery Datatables 插件来启用我的表格的分页、排序和搜索。元素出现但不工作,分页只是有时出现。在 Chrome 控制台中我收到错误:

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

Here is the demo page.

我正在使用 Bootstrap 这个插件。

该错误是由于 jQuery 版本 1.11.3 中的方法 isArraylike 引起的。 (只要)。该方法看起来像这样

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

    .......
}

该版本的 jQuery 在对象中使用 "length" 来获取长度。 (我对此一无所知)

但我知道 jquery 的其他版本没有这个问题。

版本 1.11.3 和 2.1.4(正如 James 在评论中指出的那样)有这个问题。

所以解决方案是升级到下一个版本或至少使用除 1.11.3 或 2.1.4 以外的任何其他版本

将 DataTables 升级到 DataTables 1.10.71.10.8-dev 对我不起作用(使用 jQuery 1.11.3)。

降级到 jQuery 1.11.2 确实有效(使用 DataTables 10.0.0

我正在 Rails 上 Ruby 使用 gem jquery-datatables-rails.

我直接从 GitHub 的最后一次提交更新了 gem:

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

这对我有用,我想他们很快就会发布新版本的 gem 和这个提交。

无需降级jQuery。 我通过使用 aoColumns as

解决了同样的错误
$('#id').DataTable( {
    data: [["A", "B"], ["a", "b"]],
    'aoColumns': [ 
        { sWidth: "50%", bSearchable: false, bSortable: false }, 
        { sWidth: "50%", bSearchable: false, bSortable: false }
        ],
    } );

我正在使用 jQuery 2.1.4DataTables 1.10.9

虽然与 DataTables 无关,但我遇到了这个 "cannot use in operator to search for length" 错误。这是错误的主要 Google 结果,所以只是想 post 我的问题作为回应,以防它对其他人有帮助。

我有:

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

我忘记用 $ 包装我的选择器,所以修复是为了确保我将实际的 jQuery 元素作为第一个参数传递给 map 而不是只是一个字符串...

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

我对这个 post 几乎感到尴尬 ;)

干杯

我通过像这样添加 json 数据类型解决了类似的问题:

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

在我的控制器中,我必须像这样在任何字符串周围使用双引号(注意:它们必须在 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;
}

我遇到了完全相同的问题,但 jQuery 版本不是我的罪魁祸首。就我而言,我错误地序列化了表单。以这个错误结束的代码是:

$('#form_name').serialize()

而我应该使用。

$('#form_name').serializeArray()

我这样做了,我的问题得到了解决。

只是扔掉我忽略的这个小片段。可以帮助别人。

使用 DataTables 并使用 AJAX 调用 PHP-脚本,请注意您只需要在末尾 回显您的数组 。不需要先用 json_encode.

将它编码为 JSON 对象

所以

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

否则你可能会遇到可怕的错误

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

或者这个

Uncaught TypeError: Cannot read property 'length' of undefined

在我的例子中,此错误的根本原因是在 ajax 数据 table 调用中传递的无效列详细信息。

$("#example1").DataTable({            
        searching: false,            
        paging: false,
        serverSide: true,        
        ajax: {
            url:"data-url",
            type:"post",                
            data:{
                key:"key_id"
            }
        },
        columns: [
           {"data":"column_1","name":"column_name_1"},                                      
           {"data":"EScore","name":"EScore"}
        ]
});

早些时候我遇到了“未捕获的类型错误:无法使用 'in' 运算符来搜索 'length' 当我通过

columns: ["column_1","column_2"]

我通过传递正确的结构解决了这个问题

columns: [ 
    {"data":"column_1","name":"column_name_1"},                                      
    {"data":"EScore","name":"EScore"}
 ]