【问题标题】:jQuery UI Autocomplete Multiple Values in TextboxjQuery UI 自动完成文本框中的多个值
【发布时间】:2013-10-12 12:17:16
【问题描述】:

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

我一直在尝试搜索如何做到这一点。我唯一设法找到的是可以添加multiple: true (http://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
        });
    });

【问题讨论】:

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


    【解决方案1】:

    试试这个:

      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

    【讨论】:

    • 太棒了! :) 我唯一的问题是我似乎无法让它与上面代码中的 RegEx 一起工作。现在它忽略了正则表达式
    • 这是正确的,但它不适用于我拥有的 RegEx。我希望建议与搜索的第一个字母匹配,而不是“逐个字母”。这是我唯一的问题。如果您查看我发布的代码,我有一个正则表达式来满足这一点。即使您的代码有效,但当我添加 RegEx 代码时,我上面的建议仅显示在第一个单词中。
    • 有没有一种方法可以从数据库中获取数据,而不是使用预定义的列表。提前致谢。
    【解决方案2】:

    为了解决同一文本框中多个字符串的问题并包含一个正则表达式以仅显示与字符串开头匹配的建议,我执行了以下操作:

        $('#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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多