2013-10-05 143 views
5

我需要一个简单的自动完成搜索功能,但也允许用户输入多个值。我正在使用jQuery UI的自动填充小部件(http://jqueryui.com/autocomplete/),到目前为止,我已将源设置为只搜索建议中的第一个字母。我现在要添加的是用户能够从同一文本框中搜索多个项目的功能。 (即再次显示逗号建议后)jQuery UI自动完成文本框中的多个值

我一直在试图搜索如何做到这一点。我设法找到的唯一一个选项是可以添加multiple: truehttp://forum.jquery.com/topic/multiple-values-with-autocomplete)。事情是,它甚至没有在文档中列出,所以我不知道该选项是否已经改变或不存在了。

这是我的代码:

var items = [ 'France', 'Italy', 'Malta', 'England', 
     'Australia', 'Spain', 'Scotland' ]; 

    $(document).ready(function() { 
     $('#search').autocomplete({ 
      source: function (req, responseFn) { 
       var re = $.ui.autocomplete.escapeRegex(req.term); 
       var matcher = new RegExp('^' + re, 'i'); 
       var a = $.grep(items, function (item, index) { 
        return matcher.test(item); 
       }); 
       responseFn(a); 
      } 
     }); 
    }); 

我试了一下:

var items = [ 'France', 'Italy', 'Malta', 'England', 
     'Australia', 'Spain', 'Scotland' ]; 

    $(document).ready(function() { 
     $('#search').autocomplete({ 
      source: function (req, responseFn) { 
       var re = $.ui.autocomplete.escapeRegex(req.term); 
       var matcher = new RegExp('^' + re, 'i'); 
       var a = $.grep(items, function (item, index) { 
        return matcher.test(item); 
       }); 
       responseFn(a); 
      }, 
      multiple: true 
     }); 
    }); 

回答

3

为了解决多个字符串的问题在相同的文本框,并包括一个正则表达式,只显示匹配字符串的开头的建议我做了以下操作:

$('#search').autocomplete({ 
     minLength: 1, 
     source: function (request, response) { 
      var term = request.term; 

      // substring of new string (only when a comma is in string) 
      if (term.indexOf(', ') > 0) { 
       var index = term.lastIndexOf(', '); 
       term = term.substring(index + 2); 
      } 

      // regex to match string entered with start of suggestion strings 
      var re = $.ui.autocomplete.escapeRegex(term); 
      var matcher = new RegExp('^' + re, 'i'); 
      var regex_validated_array = $.grep(items, function (item, index) { 
       return matcher.test(item); 
      }); 

      // pass array `regex_validated_array ` to the response and 
      // `extractLast()` which takes care of the comma separation 

      response($.ui.autocomplete.filter(regex_validated_array, 
       extractLast(term))); 
     }, 
     focus: function() { 
      return false; 
     }, 
     select: function (event, ui) { 
      var terms = split(this.value); 
      terms.pop(); 
      terms.push(ui.item.value); 
      terms.push(''); 
      this.value = terms.join(', '); 
      return false; 
     } 
    }); 

    function split(val) { 
     return val.split(/,\s*/); 
    } 

    function extractLast(term) { 
     return split(term).pop(); 
    } 
9

试试这个:

function split(val) { 
    return val.split(/,\s*/); 
    } 

    function extractLast(term) { 
    return split(term).pop(); 
    } 

    $("#search") 
     .autocomplete({ 
      minLength: 0, 
      source: function(request, response) { 
       response($.ui.autocomplete.filter(
        items, extractLast(request.term))); 
      }, 
      focus: function() { 
       return false; 
      }, 
      select: function(event, ui) { 
       var terms = split(this.value); 
       terms.pop(); 
       terms.push(ui.item.value); 
       terms.push(""); 
       this.value = terms.join(", "); 
       return false; 
      } 
     }); 

查阅DEMO

+0

太棒了! :)唯一的问题是,我似乎无法让它与上面的代码中的RegEx一起工作。现在它忽略了RegEx –

+1

如果它是正确的,那么你接受这个答案 –

+0

这是正确的,但它没有与我所拥有的RegEx一起工作。我希望这些建议与搜索的第一个字母相匹配,而不是“逐字母”。这是我唯一的问题。如果你看看我发布的代码,我有一个RegEx来迎合这个。即使您的代码正常工作,但在添加RegEx代码时,我仅对第一个单词显示以上建议。 –