JQuery UI自动完成,以任何顺序查找所有单词

时间:2014-08-09 16:09:46

标签: javascript regex jquery-ui jquery-ui-autocomplete

我正在使用JQuery UI Autocomplete javascript程序。我试图以任何顺序在搜索框中找到所有单词。这意味着如果我搜索"三一二"如果在数据库中有一个名为" One Two Three"的条目,我希望它被选中。这听起来很复杂,但它真的不应该。这是我的代码:

$( "#autocomplete" ).autocomplete({
    max:10, minLength:2, source: function (request, response) {    
        var term = request.term;    
        var list = term.split(" ");
        var arr = [  ]; 
        for (var i = 0; i < list.length; i++) { 
            var buf = "/"+list[i]+"/";
            arr.push(buf);
        }
        var rez = [];
        for (var n = 0; n < availableTags.length; n++) { 
             for (var i = 0; i < arr.length; i++) { 
                if(arr[i].test(availableTags[n]){
                    rez.push(abailableTags[n]);
                }
             } 
        }   
        response(rez); 
        return;    
    }    
});

它还没有工作。如果有人可以在这个代码中提供任何指示,也许告诉我哪里出错,那就太棒了!我可以让JQuery Autocomplete工作,但不能使它与RegEx搜索术语相匹配。谢谢!

2 个答案:

答案 0 :(得分:2)

我正在研究一个类似的问题,我想显示所有匹配项,无论关键字的顺序如何。只是为了澄清我将展示一个例子:

list = ["AK-47 Redline (Minimal Wear)","Statrak AK-47 Redline (Minimal Wear)", "M4A1-S Something (Minimal Wear)"];

这是我的“数据库”,如果我输入“minimal wear”,我会得到一切的结果,但我的想法是能够输入“ak minimal wear”,从而得到以下建议:{{1但是我没有得到任何东西,因为jquery的自动完成检查提供的关键字是否是indexOf列表中的任何元素。所以在我的情况下,我实现了一个自定义搜索,我递归地生成一个匹配每个关键字的结果列表。小例子:

关键字:ak wear,

列表:[“AK-47红线(略有磨损)”,“Statrak AK-47红线(略有磨损)”,“M4A1-S Something(略有磨损)”]

首先我生成一个包含第一个关键字的列表:ak,然后我用新生成的列表进行递归调用,但是这次我检查下一个关键字,然后我继续直到我到达最后一个关键字并且最后返回生成列表。

以下是javascript代码:

AK-47 Redline (Minimal Wear), Statrak AK-47 Redline (Minimal Wear)

这是JSFiddle

答案 1 :(得分:0)

我几天前写了类似的代码。

var availableTags = [
    'One Two Three',
    'Four Five Six',
    'Seven Eight Nine Ten'];

$('#tags').autocomplete({
    source: availableTags,
    search: function (event, ui) {
        $('#wrapper').empty();
    },
    select: function (e, ui) {
        $(this).val(ui.item.name);
        return false;
    },
})
    .data('autocomplete')._renderItem = function (ul, item) {
    matchFound = 0;
    var inp = $("#tags").val().split(" ");
    var items = item.label.split(" ");
    for (var i = 0; i < items.length; i++) {
        for (var j = 0; j < inp.length; j++) {
            index = items[i].toUpperCase().indexOf(inp[j].toUpperCase());
            if (index > -1) {
                matchFound += 1;
            } else {
                matchFound += 1;
            }
        }
        if (matchFound == inp.length) {
            return $('<div class="element"></div>')
            .data('item.autocomplete', item.label)
            .append('<a href="#">' + item.label + '</a>')
            .appendTo($('#wrapper'));
            break;

        }
    }
};

它可能对你有所帮助。 JSFiddle