Jquery Autocomplete搜索基于每个单词的第一个字符

时间:2014-09-03 06:52:54

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

任何人都可以帮我吗?

自动填充应基于句子中每个单词的首字母。

例如

如果我正在搜索" s"

结果应为:

http://i.stack.imgur.com/9H9ma.gif

结果应该基于" s"每个单词的第一个字符在句子上。

帮我解决这个问题..

提前致谢。

尝试:

    $(document).ready(function() {
       $("#request").autocomplete({
          source: function(req, responseFn) { 
             var re = $.ui.autocomplete.escapeRegex(req.term); 
             var matcher = new RegExp( "\\b" + re, "i" ); 
             var a = $.grep( charity_names, function(item,index){ 
                return matcher.test(item); 
             });
             responseFn( a ); 
          }, delay:0 
       }); 
    });

对于Highting我使用此代码的文本:

/ *自动填充突出显示* /

String.prototype.replaceAt = function(index, char) {
    return this.substr(0, index) + "<span style='font-weight:bold;color:#333;'>" + char + "</span>";
}
$.ui.autocomplete.prototype._renderItem = function(ul, item) {
    this.term = this.term.toLowerCase();
    var resultStr = item.label.toLowerCase();
    var t = "";
    while (resultStr.indexOf(this.term) != -1) {
        var index = resultStr.indexOf(this.term);
        t = t + item.label.replaceAt(index, item.label.slice(index, index + this.term.length));
        resultStr = resultStr.substr(index + this.term.length);
        item.label = item.label.substr(index + this.term.length);
    }
    return $("<li></li>").data("item.autocomplete", item).append("<a style='padding:4px 4px; display:block; width:97.3%;'>" + t + item.label + "</a>").appendTo(ul);    
};

/* Autocomplete highlighting Ends here*/

1 个答案:

答案 0 :(得分:0)

好的,您的代码有几点:

  • 你经常过度复杂化。使用正则表达式可以大大简化_renderItem,并删除所有indexOfsubstr次调用。实际上,您已经在source函数中使用了所需的正则表达式。
  • 此刻,一切都会变成小写。正则表达式将会神奇地&#34;为你解决这个问题
  • 您在term匹配后放弃了所有内容。同样,正则表达式&#34;魔术&#34;
  • ,不需要额外的努力就可以解决这个问题
  • 直接覆盖库prototype通常是不好的做法。 jQueryUI有一个优秀的小部件工厂,它的非常易于使用。

因此,针对以上几点,您可以执行以下操作:

$.widget("my.customAutocomplete", $.ui.autocomplete, {
    _renderItem: function(ul, item) {
        return $("<li>").append(
               $("<a>").html(
                     item.label.replace(
                           new RegExp("\\b" + this.term, "i"),
                           "<span style='font-weight:bold;color:#333;'>$&</span>"
                     )
               )).appendTo(ul);
    }
});

将此与您已经拥有的source过滤相结合

Here's an example fiddle(也有html转义,不确定你的例子中是否故意忽略了这一点)