JQuery Datatablesプラグインを使用して、ページのページネーション、ソート、検索を有効にします。要素は表示されていますが機能していません。また、ページネーションが表示されることもあります。 Chrome consoleでエラーが発生しています:
Uncaught TypeError: Cannot use 'in' operator to search for 'length' in
このプラグインと一緒に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は、長さを取得するためにオブジェクトで「長さ」を使用していました。 (私はそれについて何も知りません)。
ただし、jqueryの他のバージョンにはこの問題がないことは知っています。
バージョン1.11.3および2.1.4(Jamesがコメントで指摘したように)にはこの問題があります。
したがって、解決策は、次のバージョンにアップグレードするか、少なくとも1.11.3または2.1.4以外のバージョンを使用することです。
私はRuby on Rails gem jquery-datatables-Railsで作業しています。
GitHubの最後のコミットからgemを直接更新します。
gem 'jquery-datatables-Rails', github: "rweng/jquery-datatables-Rails", branch: "master"
これは私にとってはうまくいきますが、このコミットですぐに新しいバージョンのgemをリリースすると思います。
DataTablesからDataTablesへのアップグレード1.10.7
または1.10.8-dev
がうまくいきませんでした(jQueryを使用して1.11.3
)。
JQueryへのダウングレード1.11.2
は機能しました(DataTablesを使用10.0.0
)
DataTablesとは無関係ですが、この「長さを検索するための演算子では使用できません」というエラーに遭遇しました。これがエラーの主なGoogle結果であったため、他の人に役立つ場合に備えて、私の問題を応答として投稿したかっただけです。
私が持っていた:
ApplicationIDs: $.map(".application-checkbox:checked", function (checkedApplicationCheckbox, i) {
セレクタを$
でラップするのを忘れていたので、修正は、実際のjQuery要素を文字列だけでなくmap
への最初の引数として渡すようにすることでした...
ApplicationIDs: $.map($(".application-checkbox:checked"), function (checkedApplicationCheckbox, i) {
私はこれを投稿するのはほとんど恥ずかしいです;)
乾杯
JQueryをダウングレードする必要はありません。 aoColumns
を使用して同じエラーを解決しました
$('#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
Json dataTypeを次のように追加して、同様の問題を修正しました。
$.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();
そうしないと、恐ろしいエラーが発生する可能性があります
キャッチされないTypeError:「in」演算子を使用して「length」を検索することはできません
またはこれ
不明なTypeError:未定義のプロパティ 'length'を読み取れません