Jquery ui jQuery UI自动完成的jQuery扩展

Jquery ui jQuery UI自动完成的jQuery扩展,jquery-ui,jquery-ui-autocomplete,jquery-widgets,Jquery Ui,Jquery Ui Autocomplete,Jquery Widgets,我试图扩展默认的jQuery UI 1.8.16自动完成插件,以完成以下几件事: 搜索匹配项时,检查值数组,而不仅仅是标签/值 根据菜单项上的类别以不同的模式呈现该菜单项 为此,我开始研究代码。我对编写小部件/插件非常陌生,所以我想知道是否有人能帮助我理解这一部分。我目前正在尝试执行以下操作: $.widget("custom.advautocomplete", $.ui.autocomplete, { filter: function (array, term)

我试图扩展默认的jQuery UI 1.8.16自动完成插件,以完成以下几件事:

  • 搜索匹配项时,检查值数组,而不仅仅是标签/值
  • 根据菜单项上的类别以不同的模式呈现该菜单项
  • 为此,我开始研究代码。我对编写小部件/插件非常陌生,所以我想知道是否有人能帮助我理解这一部分。我目前正在尝试执行以下操作:

       $.widget("custom.advautocomplete", $.ui.autocomplete, {
                filter: function (array, term) {
    
                    var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
                    return $.grep(array, function (value) {
                        return matcher.test(value.label || value.alldata || value);
                    });
                },
    
                _renderMenu: function (ul, items) {
    
                    var self = this,
                                    currentCat = "";
    
                    $.each(items, function (index, item) {
    
                        if (currentCat != item.category) {
                            ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>");
                            currentCat = item.category;
                        }
    
                        self._renderItem(ul, item);
                    });
                },
    
                _renderItem: function (ul, item) {
                    return $("<li></li>")
                                .data("item.autocomplete", item)
                                .append($("<a></a>").text(item.alldata))
                                .appendTo(ul);
                }
            });
    

    从我到目前为止收集的信息来看,这是对前面通过调用
    $.widget(“ui.autocomplete”)定义的
    jQuery autocomplete
    的扩展…
    但是为什么这样处理呢?为什么这两个函数没有像其他函数一样在小部件定义中处理?我注意到,如果我以与基本小部件相同的方式扩展
    ui.autocomplete
    ,那么我就可以使过滤器覆盖正常工作。我想扩展控件并包括新的f同时进行过滤,这样我可以让代码更干净一点,但我不明白为什么要这样做。我缺少什么好处吗?

    原因
    escapeRegex
    filter
    是在普通小部件之外定义的,因为它们是静态函数,这意味着它们被这样调用:
    $.ui.autocomplete。过滤器
    。小部件上的其他函数在小部件的实例上调用:
    $(“.”)。自动完成(“搜索”,“搜索”)
    谢谢@AndrewWhitaker这正是我需要的答案。我对扩展jQuery太陌生,无法独自收集这些信息,但现在我明白了。但是,我们如何保持/链接新扩展的筛选函数,使其仅与自定义小部件(这里是advautocomplete)一起工作,这样它就不会影响其他正常的自动完成字段?
    $.extend($.ui.autocomplete, {
        escapeRegex: function (value) {
            return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
        },
        filter: function (array, term) {
            var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
            return $.grep(array, function (value) {
                return matcher.test(value.label || value.value || value);
            });
        }
    });