Как исправить * только один экземпляр Autocomplete на странице?

Этот ответ - jQueryUI: как я могу настроить параметры плагина Autocomplete? - описывает, как monkeypatch виджет автозаполнения jqueryUI, чтобы он отображает вещи определенным образом. Подход, который он использует, заключается в замене функции на $.ui.autocomplete.prototype.

Это означает, что все виджеты автозаполнения получат этот патч.

Есть ли способ исправить виджет автозаполнения только для одного элемента ввода? Что это?

Когда я просматриваю $('$input').autocomplete, я не вижу никаких автозаполнений fns там (_renderItem, _renderMenu, _search и т.д.).

Ответ 1

Просмотрите пользовательские данные и демонстрационную демонстрацию. Эта демонстрация не модифицирует объект-прототип виджета автозаполнения, а это означает, что выполняется только этот экземпляр виджета:

$("selector").autocomplete({ ... }).data( "autocomplete" )._renderItem = function( ul, item ) {
    return $( "<li></li>" )
        .data( "item.autocomplete", item )
        .append( "<a>" + item.label + "<br>" + item.desc + "</a>" )
        .appendTo( ul );
};

Вот рабочая демонстрация: http://jsfiddle.net/vJSwq/

Ответ 2

Код от Andrew Whitaker работает только для ввода одного. Если вы выберете более одного элемента ввода, второй виджет автозаполнения не будет показывать какие-либо записи. Вы должны добавить foreach, чтобы передать все выбранные элементы ввода, например, упомянутый здесь

$("selector")
.autocomplete({ ... })
.each(function () {
    $(this).data("autocomplete")._renderItem = function( ul, item ) {
        return $("<li></li>")
            .data("item.autocomplete", item)
            .append("<a>" + item.label + "<br>" + item.desc + "</a>")
            .appendTo(ul);
    };
);

Ответ 3

Для последних версий jQuery (1.8+)/jQuery UI (1.10+) вы должны использовать:

$("selector").autocomplete({ ... }).data('uiAutocomplete')._renderItem = function( ul, item ) {
    return $( "<li></li>" )
        .data( "item.autocomplete", item )
        .append( "<a>" + item.label + "<br>" + item.desc + "</a>" )
    .appendTo( ul );
};