【问题标题】:jQuery Autocomplete UI search all directionsjQuery Autocomplete UI 搜索所有方向
【发布时间】:2013-05-02 12:39:39
【问题描述】:

我正在使用 jQuery Autocomplete 来显示来自大约 2000 条记录的列表的结果。因为我认为这个列表很长,所以我需要一个好的过滤器来搜索所有这些记录。

我已经修改了源,这样我不仅可以在标签字段中进行搜索,还可以在值字段中进行搜索。我现在想要的是我可以搜索“S4 Galaxy”,它会找到“Samsung Galaxy S4”。标准的jquery自动完成只能从左到右搜索,所以会找到“galaxy s4”,但不会找到“s4 galaxy”。我也想看“gal s4”,找到“Samsung Galaxy S4”。

另外,如果匹配加粗就更好了 > "Samsung Galaxy S4"

我现在使用的完整代码如下:

var completeResults = [{
    value: "S4 iv",
    label: "Samsung Galaxy S4",
    image: "samsung_galaxy_s_iv_1.jpg"
}, {
    value: "stackoverflow",
    label: "Nokia lumia 920",
    image: "nokia_lumia_920_1.jpg"
}];

completeResults 现在是一个简短的列表!通常大约 2000 条记录。

function custom_source(request, response) {
    var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
    response($.grep(completeResults, function (value) {
        return matcher.test(value.value) || matcher.test(value.label);
    }));
}

$("#s").autocomplete({
    source: custom_source,
    minLength: 0
}).data("ui-autocomplete")._renderItem = function (ul, item) {
    var inner_html = "<a><img src='../img/type/120x200/" + item.image + "' width='21' height='35'/><span class='title'>" + item.label + "</span></a>";

    return $("<li></li>")
        .data("item.autocomplete", item)
        .append(inner_html)
        .appendTo(ul);
};

【问题讨论】:

  • 有了这么多记录,您最好在服务器上进行搜索
  • 好吧,我想在浏览器中执行此操作,这样我就可以减少数据库查询。我怎么能做这个服务器端?用 PHP 吗?我不想连续查询数据库,因为如果每天有几千人使用它,我会占用大量数据库!
  • 确实如此,绝对是一种权衡。但是,您的 Web 服务器可以处理数千个请求。还有一个问题——如果我输入“诺基亚三星”,我应该得到两个结果吗?还是必须在建议项中找到每个术语?
  • “诺基亚三星”不会给出任何结果。仅一项中的所有匹配项!

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


【解决方案1】:

好的,这应该是可行的(减去文本的粗体,我会谈到)。基本上策略是:

  1. 从用户键入的每个术语中创建一个正则表达式。我们可以通过拆分' ' 上的输入来做到这一点。
  2. 对于可能选项列表中的每个选项,查看该选项是否与我们在步骤 1 中提取的每个正则表达式匹配。
  3. 仅返回符合第 2 步中条件的值。
function custom_source(request, response) { 
    // Create an array of regular expressions from the user's input:
    var terms = $.map(request.term.split(' '), function (term) {
        // Ignore just whitespace:
        if ($.trim(term)) {
            return new RegExp($.ui.autocomplete.escapeRegex(term), 'i');
        }
    });

    response($.grep(completeResults, function (value) {
        var found = true
            , i
            , regex;

        // For every result, iterate over every term we extracted earlier and make sure it matches:
        for (i = 0; i < terms.length && found; i++) {
            regex = terms[i];
            found = found && (regex.test(value.value) || regex.test(value.label));
        }

        return found;
    }));
}

示例: http://jsfiddle.net/Aa5nK/73/

您问题的另一部分在以下问题中得到回答:

jQueryUI: how can I custom-format the Autocomplete plug-in results?

【讨论】:

  • 唯一的事情是我会说如果格式解决方案使用 CSS 类而不是嵌入样式会更好。 +1 链接
  • 太好了,这很好用!我将对其进行测试,如果可以,这将是答案。但是,在 IE10 中它非常慢.. 这是一个问题,因为这一切都是由浏览器完成的?在那种情况下,服务器端会更好吗?如果是这样,我可以在已经准备好的文件中执行此操作,这样我就不需要任何 SQL 查询。
  • @Timo002:我可以尝试使用一个正则表达式,而不是针对每个术语测试一个正则表达式。是的,它很慢,因为浏览器正在执行过滤器。一秒钟,我会更新答案
  • @Timo002:嗯,我收回这句话,也许它不像我想象的那么容易。不过我会坚持下去的。
  • @AndrewWhitaker:您的代码运行良好。但是,正如您已经提到的......服务器端可能会更快。在 Chrome 中,响应相对较快。但是在 IE10 中它非常慢。所以现在我可能正在寻找服务器端解决方案。我认为是 AJAX / PHP,但我希望它通过本地文件而不是在数据库中搜索。
猜你喜欢
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多