jQuery UI自动完成 - 构建自定义源

时间:2012-08-08 09:11:57

标签: json jquery-ui jquery-ui-autocomplete

我有以下形式的json数组:

[{"label":<some-label>,"spellings":[<list of spellings>]}, ...]

我需要使用jquery ui autocomplete来解析上面的数组。但是,限制很少:

  1. 自动填充建议应包含来自“拼写”的匹配,但应仅建议相应的“标签”。例如如果“标签”有n个“拼写”,则自动填充应仅显示n个“拼写”的特定“标签”。
  2. 从提供的建议中选择时,相应的“标签”应仅反映在文本输入框中。
  3. 我该如何处理?有什么指针吗?

    并且,如何迭代相应“标签”的“拼写”列表?

    这是我正在尝试做的,但是输出乱码。

    var labels = []
    var values = [] 
    $.getJSON($url, function(data) { 
      $.each(data, function(key, val) { 
        for (var v in val.value)
          values.push(val.value[v])
        labels.push(val.label)
    }); 
    $("#text1").autocomplete({ 
      minLength: 2, 
      source: values, 
      focus: function(event, ui) { 
        $("#text1").val(ui.item.label); 
        return false; 
      }, 
      select: function(event, ui) { 
        $("#text1").val(ui.item.label); 
        return false; 
      } 
    });
    });
    

1 个答案:

答案 0 :(得分:4)

我会建立一个单独的源数组,每个拼写一个,其中label属性是每个拼写的标签,value属性是拼写本身。这将使您能够快速筛选结果,而无需迭代每个对象的spelling数组并检查可能需要一段时间的匹配。

然后,在为source定义的函数中,您可以执行自己的过滤逻辑,只允许建议列表中每个“标签”的一个实例。

这样的事情应该有用(请注意,自动完成在$.getJSON回调中初始化。这是确保在窗口小部件初始化之前加载源数据所必需的):

$.getJSON($url, function(data) {
    $.each(data, function (i, el) {
        source.push({ label: el.label, value: el.label });

        $.each(el.spellings, function (j, spelling) {
            source.push({ label: el.label, value: spelling });
        });
    });

    /* initialize the autocomplete widget: */
    $("input").autocomplete({
        source: function (request, response) {
            var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i")
                , results = [];

            /* Make sure each entry is only in the suggestions list once: */
            $.each(source, function (i, value) {
                if (matcher.test(value.value) && $.inArray(value.label, results) < 0) {
                    results.push(value.label);
                }
            });
            response(results);
        }
    });
}); 

示例: http://jsfiddle.net/MaMZt/