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()
保持和平,尽管周围的所有智慧都可能不是一件好事吗?
感谢您的想法......
答案 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" },...]
希望能帮助别人!