选择时的JQuery AutoComplete事件

时间:2015-12-09 09:19:57

标签: jquery jquery-autocomplete

我正在使用自动完成功能从选项列表中进行选择,该列表包含值的选项值和名称的数字ID。

AutoComplete / combox工作正常,但如何捕获select事件?当从列表中进行选择时,我想使用该值来更新DOM的其他元素。

我一直在搜索并找到AutoComplete上的文档: https://api.jqueryui.com/autocomplete/#event-change

我试过了:

ToString()

HTML:

    if ( typeof $("#uid").autocomplete == "function" ) {
            $("#uid").on("autocompleteselect", function( event, ui ) {
                    alert("HERE");    
            });
    }

Javascript:

    <p class="dlgline">
    <label for="uid">Select user:</label><br>
    <select id="uid" name="uid" style="display: none;"><option id="0"></option>
    <option value="3">Name 1</option>
    <option value="1">Another Name</option>
    <option value="2">And Another</option>
    </select>
    <span class="custom-combobox"><input title="" class="custom-combobox-input ui-widget ui-widget-content ui-state-default ui-corner-left ui-autocomplete-input" autocomplete="off"><a tabindex="-1" title="Show All Items" class="ui-button ui-widget ui-state-default ui-button-icon-only custom-combobox-toggle ui-corner-right" role="button"><span class="ui-button-icon-primary ui-icon ui-icon-triangle-1-s"></span><span class="ui-button-text"></span></a></span>

在显示对话框之前以及填充内容之后:

    $.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.autocomplete( "instance" ).term = "";
    },

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

的jsfiddle:

http://jsfiddle.net/SimonPlatten/wLxdjorp/3/

这是我所依据的原始代码:

https://jqueryui.com/resources/demos/autocomplete/combobox.html

3 个答案:

答案 0 :(得分:1)

尝试使用jquery ui的select事件:

https://api.jqueryui.com/autocomplete/#event-select

答案 1 :(得分:1)

使用

 $( ".selector" ).autocomplete({
        select:function(value, data) {
        //your selection code goes here
        }
});

答案 2 :(得分:0)

我修改了成员函数:

        this._on( this.input, {
            autocompleteselect: function( event, ui ) {
                ui.item.option.selected = true;
                this._trigger( "select", event, {
                    item: ui.item.option
                });
                if ( objPeople && objPeople[ui.item.value] ) {
        var objUser = objPeople[ui.item.value];
        alert("HERE");            
      }
            },
            autocompletechange: "_removeIfInvalid"
        });

这很有效。