【问题标题】:Jquery Autocomplete - prefill the text fieldJquery Autocomplete - 预填充文本字段
【发布时间】:2011-12-29 12:39:33
【问题描述】:

我有一个自动完成字段(改编自地理自动完成以查找地理位置),当用户从列表中选择位置时,我会抓取纬度/经度和其他一些用于搜索的信息。但是现在它只有在用户实际从自动完成列表中选择时才有效(而不是开始输入并点击输入,例如他们没有从列表中选择)。

我看到我希望在http://www.airbnb.com/ 上复制的行为,基本上,如果您开始输入一个位置(例如伦敦),实际的文本字段会预先填充列表中的第一个条目 - 有人可以解释一下这是怎么做到的用jquery自动完成完成?我可以将 autoFocus 设置为 true,它专注于第一个字段,但实际上并没有填充文本字段?

任何帮助表示赞赏。

【问题讨论】:

  • 您不仅希望第一个条目站在那里,而且必须选择自动插入的部分,如果您继续输入,它将被覆盖。
  • 我不认为 jQuery UI 自动完成提供了这样的行为。发现 this other autocomplete plugin 可以满足您的需求。不过可能有点过时了。

标签: jquery autocomplete


【解决方案1】:

这里有一个解决方案。它可能需要一些调整才能在同一页面上使用多个自动完成功能,但它可以使用一个:

(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

autofill 和 createSelection 方法取自 autocomplete plugin,实时事件的绑定受到 post 的启发。

享受


编辑

我已经修改了代码,所以现在它与 jQuery UI 自动完成小部件完全集成。它适用于同一页面上的多个插件实例。

:o)

【讨论】:

  • 谢谢 Didier,我收到错误消息“未定义事件”,有什么想法吗?
  • 对不起,我让它按原样工作。初始化代码为:$('.for-autocomplete').autocomplete({selectFirst: true, source: ... });(别忘了新选项selectFirst: true(不好意思忘了提))。
  • 如果您这样做,请在此处发布。很高兴它有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多