jquery-ui-autocomplete - 附加搜索词时如何重用 jquery-ui-autocomplete 缓存结果?

标签 jquery-ui-autocomplete

我有以下 JS 方法将 jQuery UI 自动完成小部件绑定(bind)到搜索文本框。一切工作正常,包括缓存,只是在附加搜索词时进行了不必要的服务器调用,因为我不重复使用刚刚检索的结果。

例如,搜索“ab”会从服务器获取一些结果。在搜索框中的“ab”后面键入“c”将从服务器获取“abc”结果,而不是重用缓存的“ab”结果并忽略与“abc”不匹配的结果。

我沿着手动查找“ab”搜索结果的路径,使用正则表达式过滤它们以选择“abc”子集,但这完全看起来像是我在重新发明轮子。告诉小部件使用“ab”结果,但过滤它们的“abc”术语并重新显示缩短的下拉列表的正确、规范的方法是什么?

function bindSearchForm() {
    "use strict";
    var cache = new Object();

    $('#search_text_field').autocomplete({
        minLength: 2,
        source: function (request, response) {
            var term = request.term;
            if (term in cache) {
                response(cache[term]);
                return;
            }
            $.ajax({type: 'POST',
                    dataType: 'json',
                    url: '/get_search_data',
                    data: {q: term},
                    success: function (data) {
                        cache[term] = data;
                        response(data);
                    }
            });
    });
}

最佳答案

这是我的“蛮力,重新发明轮子”方法,目前看来是正确的解决方案。

function bindSearchForm() {
    "use strict";
    var cache = new Object();
    var terms = new Array();

    function cacheNewTerm(newTerm, results) {
        // maintain a 10-term cache
        if (terms.push(newTerm) > 10) {
            delete cache[terms.shift()];
        }
        cache[newTerm] = results;
    };

    $('#search_text_field').autocomplete({
        minLength: 2,
        source: function (request, response) {
            var term = request.term.toLowerCase();
            if (term in cache) {
                response(cache[term]);
                return;
            } else if (terms.length) {
                var lastTerm = terms[terms.length - 1];
                if (term.substring(0, lastTerm.length) === lastTerm) {
                    var results = new Array();
                    for (var i = 0; i < cache[lastTerm].length; i++) {
                        if (cache[lastTerm][i].label.toLowerCase().indexOf(term) !== -1) {
                            results.push(cache[lastTerm][i]);
                        }
                    }
                    response(results);
                    return;
                }
            }
            $.ajax({type: 'POST',
                    dataType: 'json',
                    url: '/get_search_data',
                    data: {q: term},
                    success: function (data) {
                        cacheNewTerm(term, data);
                        response(data);
                        return;
                    }
            });
    });
}

关于jquery-ui-autocomplete - 附加搜索词时如何重用 jquery-ui-autocomplete 缓存结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14130676/

相关文章:

jquery - 如何防止在快速输入时打开 jquery UI 自动完成下拉菜单

javascript - Jquery 自动完成建议 - 小字体列表

jquery - 执行自动完成搜索时如何显示加载图标?

javascript - 使用 typeahead 在 C# 中自动完成不起作用

jquery - Ajax/Jquery 自动完成 JSON 数据

javascript - jQuery UI 自动完成对象

jquery - 我的 jQuery UI 自动完成功能不起作用?

php - 返回但未显示的 jQuery 自动完成数据

jquery - 关闭 jQuery UI 自动完成中的 element.style

javascript - jQuery 自动完成数据未定义错误