使用变量中的JSON值自动完成源代码?

时间:2012-04-19 09:51:28

标签: jquery json jquery-ui object autocomplete

jQuerys .autocomplete()函数有两个变体,它的'source'选项。

字符串数组:

[ "Choice1", "Choice2" ]

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

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

这些都可以直接传递给.autocomplete()函数:

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

OR

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

但是当作为变量传递时,我无法工作:

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

这与将变量隐式转换为字符串有关 - autocomplete将变量中的值与处理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()保持和平,尽管周围的所有智慧都可能不是一件好事吗?

感谢您的想法......

2 个答案:

答案 0 :(得分: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" ]' ); 

答案 1 :(得分:1)

这里的一个潜在问题是自动完成插件接受的“JSON”,详见documentation

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

实际上并不是有效的JSON。 JSONLint.com明确表示了这一点。

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

答案是我们需要引用属性名称和值。有效的表示法是:

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

希望能帮助别人!