Jquery Autocomplete - предварительно заполнить текстовое поле - PullRequest
5 голосов
/ 15 ноября 2011

У меня есть поле автозаполнения (адаптированное из geo autocomplete для поиска геолокации), когда пользователь выбирает местоположение из списка, я беру широту / долготу и некоторую другую информацию, используемую для поиска. Однако сейчас это работает только в том случае, если пользователь фактически выбирает из списка автозаполнения (вместо того, чтобы начать печатать и нажимать клавишу ввода, например, они не выбрали из списка).

Я вижу поведение, которое хочу воспроизвести на http://www.airbnb.com/,, в основном, если вы начнете вводить местоположение (например, Лондон), фактическое текстовое поле предварительно заполнено первой записью в списке - кто-то может объяснить, как это можно сделать с помощью автозаполнения jquery? Я могу установить для autoFocus значение true, которое фокусируется на первом поле, но фактически не заполняет текстовое поле?

Любая помощь приветствуется.

1 Ответ

2 голосов
/ 15 ноября 2011

Вот решение.Может потребоваться некоторая настройка для работы с несколькими автозаполнениями на одной странице, но он работает с одной:

(function( $ ) {

    $.extend($.ui.autocomplete.prototype, {

        _createSelection: function($input, start, end) {

            // get a reference to the input element
            var field = $input.get(0);

            // set the selection (browser specific methods)
            if( field.createTextRange ){
                var selRange = field.createTextRange();
                selRange.collapse(true);
                selRange.moveStart("character", start);
                selRange.moveEnd("character", end);
                selRange.select();
            } else if( field.setSelectionRange ){
                field.setSelectionRange(start, end);
            } else {
                if( field.selectionStart ){
                    field.selectionStart = start;
                    field.selectionEnd = end;
                }
            }

            field.focus();
        },

        _autoFill: function($input, sValue) {

            // here 'this' is the plugin itself
            // if the last user key pressed was backspace, don't autofill
            if (this._lastKeyPressCode != 8) {

                // fill in the value (keep the case the user has typed)
                $input.val($input.val() + sValue.substring(this._previousValue.length));

                // select the portion of the value not typed by the user (so the next character will erase)
                this._createSelection($input, this._previousValue.length, sValue.length);
            }
        },

        _previousValue: '',
        _lastKeyPressCode: null
    });

        $( ".ui-autocomplete-input" )
        .live( "keyup", function() {

            var $this = $(this),
                autocomplete = $this.data('autocomplete'),
                key;

            autocomplete._lastKeyPressCode = key = event.which;

            // do nothing on backslash/command keys
            if( key == 46 || (key > 8 && key < 32) )
                return autocomplete.menu.deactivate();

            // check value is different
            var v = $this.val();
            if (v == autocomplete._previousValue)
                return;

            // save value
            autocomplete._previousValue = v;

        })
        .live( "autocompleteopen", function() {

            var $this = $(this),
                autocomplete = $this.data( "autocomplete" ),
                menu = autocomplete.menu;

            // check the 'selectFirst' setting
            if ( !autocomplete.options.selectFirst ) {
                return;
            }

            // activate the menu
            menu.activate( $.Event({ type: "mouseenter" }), menu.element.children().first() );

            // set the autoFill
            autocomplete._autoFill($this, menu.element.children().first().text());
        });

    }( jQuery ));

    $('.for-autocomplete').autocomplete({selectFirst: true, source: ['aa','absolution','borinage','baba']});

Чтобы инициализировать виджет автозаполнения, вы должны добавить новый параметр selectFirst: true/false.

Методы автозаполнения и createSelection были взяты из этого плагина автозаполнения и привязкиживые события были вдохновлены этим постом .

Наслаждайтесь


Редактировать

Я адаптировал код тактеперь он полностью интегрируется с виджетом автозаполнения jQuery UI.И он работает с несколькими экземплярами плагина на одной странице.

: o)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...