由 Datatables 插件和 jQuery 1.11.3 触发的“Uncaught TypeError: Cannot use 'in' operator to search 'length' i

Posted

技术标签:

【中文标题】由 Datatables 插件和 jQuery 1.11.3 触发的“Uncaught TypeError: Cannot use \'in\' operator to search \'length\' in”【英文标题】:"Uncaught TypeError: Cannot use 'in' operator to search for 'length' in " triggered by Datatables plugin and jQuery 1.11.3由 Datatables 插件和 jQuery 1.11.3 触发的“Uncaught TypeError: Cannot use 'in' operator to search 'length' in” 【发布时间】:2015-09-17 22:22:51 【问题描述】:

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

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

Here is the demo page.

我正在使用 Bootstrap 和这个插件。

【问题讨论】:

James 如果您在演示中使用未缩小版本的库和脚本,这将极大地帮助您调试和发现问题。 面临类似问题,通过最新数据表解决:1.10.19 with jquery-rails (4.3.3) 【参考方案1】:

该错误是由于 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 在对象中使用“长度”来获取长度。 (我对此一无所知)。

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

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

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

【讨论】:

请重新检查演示 - 我已更改为 jQuery 版本 2.1.4,但仍然无法正常工作 我确实检查了从 1.11.0 到 2.1.3 的所有版本,然后我离开了 2.1.4,问题就在那里:D 哈哈很奇怪,谢谢我现在选择了2.1.3 :) 如果在 Rails 上这有帮助:github.com/rails/jquery-rails/blob/master/VERSIONS.md - 也很有趣,我跳过某些单词,如“除了”,然后去获取最新版本 2.1.4...所以未来的读者,试试 2.1 .3,即 jquery-rails 4.0.4,并在您的 application.js 中指定 /= require jquery2 这只是修复了 4 小时的错误搜索。个人使用 jquery-rails 4.0.3,但它正在工作。我相信 4.0.4 也可以。【参考方案2】:

我正在使用 gem jquery-datatables-rails 开发 Ruby on Rails。

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

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

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

【讨论】:

谢谢亚历克斯,这对我有用。希望修复程序能尽快发布。 感谢这对我也有帮助【参考方案3】:

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

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

【讨论】:

可以确认。我使用的是 jQuery 2.1.4 和 Datatables 10.0.4。升级到 DataTables 1.10.7 解决了这个问题。【参考方案4】:

无需降级 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

【讨论】:

【参考方案5】:

虽然与 DataTables 无关,但我遇到了“无法使用 in 运算符搜索长度”错误。这是该错误的主要 Google 结果,因此只想将我的问题发布为回复,以防它对其他人有所帮助。

我有:

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

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

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

我几乎不好意思发布这个;)

干杯

【讨论】:

【参考方案6】:

我通过像这样添加 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;

【讨论】:

谢谢,LeHill - 我使用的是 jQuery 2.2.4,这解决了我的问题!【参考方案7】:

我遇到了同样的问题,但 jQuery 版本不是我的罪魁祸首。就我而言,我错误地序列化了表单。最终出现此错误的代码是:

$('#form_name').serialize()

而我应该使用的。

$('#form_name').serializeArray()

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

只是扔掉我忽略的这小块。可以帮助那里的人。

【讨论】:

【参考方案8】:

使用 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();

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

未捕获的 TypeError: 无法使用 'in' 运算符搜索 'length' in

或者这个

未捕获的类型错误:无法读取未定义的属性“长度”

【讨论】:

【参考方案9】:

在我的情况下,这个错误的根本原因是由于在 ajax 数据表调用中传递的无效列详细信息。

$("#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"
 ]

【讨论】:

以上是关于由 Datatables 插件和 jQuery 1.11.3 触发的“Uncaught TypeError: Cannot use 'in' operator to search 'length' i的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery DataTables 插件实现服务器端处理?

如何在DataTables 1.10中使用JQuery DataTables“input”插件

JQuery 的 DataTables Editor 插件和 Django

jquery.dataTables--插件使用方法

JQuery插件之Jquery.datatables.js用法及api

jQuery 插件 DataTables:如何突出显示当前搜索文本?