4

jQuerys .autocomplete()関数には、「ソース」オプションの2つのバリエーションがあります。

文字列の配列:

[ "Choice1", "Choice2" ]

labelおよびvalueプロパティを持つオブジェクトの配列:

 [ { label: "Choice1", value: "value1" }, ... ]

これらは両方とも、関数に直接渡されたときに正常に.autocomplete()機能します。

$('input').autocomplete({source: [ "Choice1", "Choice2" ], minLength: 0});

また

$('input').autocomplete({source: [ { label: "Choice1", value: "value1" } ], minLength: 0});

しかし、変数として渡された場合、どちらも機能しません。

var source = '[ "Choice1", "Choice2" ]';
$('input').autocomplete({source: source, minLength: 0});

これは、変数を文字列に暗黙的にキャストすることと関係があります。オートコンプリートは、変数からの値を、AJAX source(文字列である)の処理方法と同じように扱います。

最終的には、input要素JSONの属性からの値を使用したいと思います。data-json

追加の関心のために:

$('input').autocomplete({source: $('input').data('json'), minLength: 0});

最初のバリアントでは完全に機能しますが、2番目のバリアントでは文字列の動作に戻ります。

どちらのバリアントでも使用$('input').attr('data-json')は機能しません。

両方のバリアントで機能する「ハック」は、これを行うことです。

$('input').autocomplete({source: eval($('input').attr('data-json')), minLength: 0});

2番目のバリアントで明らかに有効なものをオブジェクトとして.data()返すことができるものを見逃しましたか?JSON

eval()別の方法はありますか、それとも、それはおそらく良いことではないという周りのすべての知恵にもかかわらず、私はただ和解する必要がありますか?

あなたの考えをありがとう..

4

2 に答える 2

4
var source = '[ "Choice1", "Choice2" ]';

これは文字列であり、配列ではありません。

引用符なしで試してください:

var source = [ "Choice1", "Choice2" ];

JSON文字列からデータを取得する必要がある状況に陥った場合は、evalを使用せず(悪)、JSON.parse(すべての最新のブラウザーに搭載されている)を使用してください。

var source = JSON.parse( '[ "Choice1", "Choice2" ]' ); 

または、すでにjQueryを使用しているため

var source = $.parseJSON( '[ "Choice1", "Choice2" ]' ); 
于 2012-04-19T09:53:24.850 に答える
1

ここでの根本的な問題は、「JSON」がオートコンプリートプラグインによって受け入れられ、ドキュメントで詳しく説明されていることでした。

[ { label: "Choice1", value: "value1" }, ... ]

実際には有効なJSONではありません。JSONLint.comはこれを明らかにしました。

文字列でサンプル形式を正確に複製しましたが、オートコンプリートはその構文を直接受け入れますが、eval()を使用しない限りjsオブジェクトに変換することはできません。

答えは、値だけでなくプロパティ名も引用する必要があるということです。有効な表記法は次のとおりです。

[ { "label": "Choice1", "value": "value1" }, { "label": "Choice2", "value": "value2" },...]

それが誰かを助けることを願っています!

于 2012-05-01T02:30:31.630 に答える