【问题标题】:"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)

标签: javascript jquery twitter-bootstrap datatables


【解决方案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"}
           ]
          

          【讨论】:

            猜你喜欢
            • 2016-10-11
            • 2021-02-21
            • 2013-02-04
            • 2021-10-06
            • 1970-01-01
            • 1970-01-01
            • 2020-08-17
            • 1970-01-01
            • 2018-01-24
            相关资源
            最近更新 更多