javascript - Jquery 自动完成插件不允许用户自由输入

标签 javascript jquery autocomplete

所以我从 jquery 得到了这个代码示例。这是一个自动完成功能,仅允许用户选择数据库中的值。我想要的是它还可以从用户那里获取本地输入。你能帮我一下吗?谢谢!

    <script>

    (function( $ ) {
    $.widget( "custom.combobox", {
        _create: function() {
            this.wrapper = $( "<span>" )
                .addClass( "custom-combobox" )
                .insertAfter( this.element );

            this.element.hide();
            this._createAutocomplete();
            this._createShowAllButton();
        },

        _createAutocomplete: function() {
            var selected = this.element.children( ":selected" ),
                value = selected.val() ? selected.text() : "";

            this.input = $( "<input>" )
                .appendTo( this.wrapper )
                .val( value )
                .attr( "title", "" )
                .addClass( "custom-combobox-input ui-widget ui-widget-content ui-state-default ui-corner-left" )
                .autocomplete({
                    delay: 0,
                    minLength: 0,
                    source: $.proxy( this, "_source" )
                })
                .tooltip({
                    tooltipClass: "ui-state-highlight"
                });

            this._on( this.input, {
                autocompleteselect: function( event, ui ) {
                    ui.item.option.selected = true;
                    this._trigger( "select", event, {
                        item: ui.item.option
                    });
                },

                autocompletechange: "_removeIfInvalid"
            });
        },

        _createShowAllButton: function() {
            var input = this.input,
                wasOpen = false;

            $( "<a>" )
                .attr( "tabIndex", -1 )
                .attr( "title", "Show All Items" )
                .tooltip()
                .appendTo( this.wrapper )
                .button({
                    icons: {
                        primary: "ui-icon-triangle-1-s"
                    },
                    text: false
                })
                .removeClass( "ui-corner-all" )
                .addClass( "custom-combobox-toggle ui-corner-right" )
                .mousedown(function() {
                    wasOpen = input.autocomplete( "widget" ).is( ":visible" );
                })
                .click(function() {
                    input.focus();

                    // Close if already visible
                    if ( wasOpen ) {
                        return;
                    }

                    // Pass empty string as value to search for, displaying all results
                    input.autocomplete( "search", "" );
                });
        },

        _source: function( request, response ) {
            var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
            response( this.element.children( "option" ).map(function() {
                var text = $( this ).text();
                if ( this.value && ( !request.term || matcher.test(text) ) )
                    return {
                        label: text,
                        value: text,
                        option: this
                    };
            }) );
        },

        _removeIfInvalid: function( event, ui ) {

            // Selected an item, nothing to do
            if ( ui.item ) {
                return;
            }

            // Search for a match (case-insensitive)
            var value = this.input.val(),
                valueLowerCase = value.toLowerCase(),
                valid = false;
            this.element.children( "option" ).each(function() {
                if ( $( this ).text().toLowerCase() === valueLowerCase ) {
                    this.selected = valid = true;
                    return false;
                }
            });

            // Found a match, nothing to do
            if ( valid ) {
                return;
            }


                // Remove invalid value
                    this.input
                        .val( "" )
                        .attr( "title", value + " didn't match any item" )
                        .tooltip( "open" );
                    this.element.val( "" );
                    this._delay(function() {
                        this.input.tooltip( "close" ).attr( "title", "" );


            }, 2500 );
            this.input.data( "ui-autocomplete" ).term = "";
        },

        _destroy: function() {
            this.wrapper.remove();
            this.element.show();
        }
    });
})( jQuery );

$(function() {
    $( "#contact" ).combobox();
            $( "#cuscode" ).combobox();
    $( "#category" ).combobox();
            $( "#group" ).combobox();
    $( "#subbrand" ).combobox();
            $( "#model" ).combobox();
    $( "#compmodel" ).combobox();
    $( "#toggle" ).click(function() {
    $( "#combobox" ).toggle();
    });
});</script>

最佳答案

只需从代码中删除此行 autocompletechange: "_removeIfInvalid"_removeIfInvalid = function() block 即可。

关于javascript - Jquery 自动完成插件不允许用户自由输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21425370/

相关文章:

javascript - Jquery 获取类 "nodeId"值

javascript - Jquery 自动完成中的附加参数

Angular js : @mention in textarea

visual-studio - 如何防止Visual Studio自动完成覆盖下一个单词

javascript - 在 true 或 false 中相等数量的值之间排序的函数

javascript - 从字符串中删除数组中所有出现的字符

javascript - 如何对多个表单元素使用指令

javascript - jQuery 选择器错误

javascript - JQuery .show() 不适用于已引用的 div 内的 div

JavaScript 在外部点击时关闭