由 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.7
或 1.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.4
和DataTables 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