4

jQuerys .autocomplete()函数的“源”选项有两种变体。

字符串数组:

[ "Choice1", "Choice2" ]

具有标签和值属性的对象数组:

 [ { 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字符串(字符串)的方式相同。

最终我想使用输入元素属性中的JSON值。data-json

为了增加兴趣:

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

第一个变体完美地工作,但恢复到第二个变体的字符串行为。

使用$('input').attr('data-json')不适用于任何一种变体。

对这两种变体都有效的“hack”是这样做的:

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

我是否错过了一些允许将第二个变体中.data()明显有效JSON的对象作为对象返回的东西?

还有另一种方法,还是我只需要和平相处,eval()尽管周围有很多智慧,这可能不是一件好事?

谢谢你的想法。。

4

2 回答 2

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

那是String,而不是数组。

尝试不带引号:

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 使这一点显而易见。

我在我的字符串中完全复制了示例格式,但是虽然自动完成将直接接受该语法,但它不能转换为 js 对象,除非通过使用 eval()。

答案是我们需要引用属性名称和值。一个有效的符号是:

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

希望能帮助别人!

于 2012-05-01T02:30:31.630 回答