Multiple instances of jQuery autocomplete combobox on one page

10,984

Solution 1

Assuming all you need is to select the target element, you just need to select by class or multiple IDs like this:

$('.combobox').combobox(); // would need to add this shared class to markup

// OR
$('#combobox, #combobox2').combobox(); // should work with existing markup

I'm more for using classes so that you don't always have to manually add more IDs as you grow.

Note that the toggle button they include is just as a demo to show the underlying 'real' combobox. I don't think you need to bind a toggle.

[Fiddles found in comments:]

http://jsfiddle.net/6wMz9/ (using ID)

http://jsfiddle.net/6wMz9/1/ (4 comboboxes, using class)

Solution 2

user1264532

I wanted to do the same, i have multiple combobox instances, but the ID was the matter, so what I did was to add the same ID to the span created by the autocomplete.combobox example. The only change is in the constructor:

        _create: function () {
        console.log(this);
            this.wrapper = $("<span>")
                .addClass("custom-combobox")
                .insertAfter(this.element)
                .attr('id', this.element[0].id+'_combobox');
            this.element.hide();
            this._createAutocomplete();
            this._createShowAllButton();
        },

And just call it this way

    $("#combobox1").combobox();
    $("#combobox2").combobox();

I did this cuz I need to catch the change event on each combobox and in the other answers I couldn't achieve that. Hope this helps.

here is a jsFiddle example cheers!

Share:
10,984
user1264532
Author by

user1264532

Updated on June 05, 2022

Comments

  • user1264532
    user1264532 about 2 years

    I would like to have multiple JQuery autocomplete comboboxes on one html page. (How) is this possibe?

    I discovered the id for the combobox matters. In the example below the only combobox shown with JQuery is the first one. I prefer not to duplicate (too many of) the JQuery script code (I've put this code in a .js-file and generate the comboboxes in a .php-file)

    I have this (this is just the code from the demo example at http://jqueryui.com/demos/autocomplete/#combobox)

    <select id="combobox">
        <option value="">Select one...</option>
        <option value="ActionScript">ActionScript</option>
        <option value="AppleScript">AppleScript</option>
        <option value="Asp">Asp</option>
        <option value="BASIC">BASIC</option>
        <option value="C">C</option>
        <option value="C++">C++</option>
        <option value="Clojure">Clojure</option>
        <option value="COBOL">COBOL</option>
        <option value="ColdFusion">ColdFusion</option>
        <option value="Erlang">Erlang</option>
        <option value="Fortran">Fortran</option>
        <option value="Groovy">Groovy</option>
        <option value="Haskell">Haskell</option>
        <option value="Java">Java</option>
        <option value="JavaScript">JavaScript</option>
        <option value="Lisp">Lisp</option>
        <option value="Perl">Perl</option>
        <option value="PHP">PHP</option>
        <option value="Python">Python</option>
        <option value="Ruby">Ruby</option>
        <option value="Scala">Scala</option>
        <option value="Scheme">Scheme</option>
    </select>
    <select id="combobox2">
        <option value="">Select one...</option>
        <option value="ActionScript">ActionScript</option>
        <option value="AppleScript">AppleScript</option>
        <option value="Asp">Asp</option>
        <option value="BASIC">BASIC</option>
        <option value="C">C</option>
        <option value="C++">C++</option>
        <option value="Clojure">Clojure</option>
        <option value="COBOL">COBOL</option>
        <option value="ColdFusion">ColdFusion</option>
        <option value="Erlang">Erlang</option>
        <option value="Fortran">Fortran</option>
        <option value="Groovy">Groovy</option>
        <option value="Haskell">Haskell</option>
        <option value="Java">Java</option>
        <option value="JavaScript">JavaScript</option>
        <option value="Lisp">Lisp</option>
        <option value="Perl">Perl</option>
        <option value="PHP">PHP</option>
        <option value="Python">Python</option>
        <option value="Ruby">Ruby</option>
        <option value="Scala">Scala</option>
        <option value="Scheme">Scheme</option>
    </select>
    
    (function( $ ) {
        $.widget( "ui.combobox", {
            _create: function() {
                var self = this,
                    select = this.element.hide(),
                    selected = select.children( ":selected" ),
                    value = selected.val() ? selected.text() : "";
                var input = this.input = $( "<input>" )
                    .insertAfter( select )
                    .val( value )
                    .autocomplete({
                        delay: 0,
                        minLength: 0,
                        source: function( request, response ) {
                            var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
                            response( select.children( "option" ).map(function() {
                                var text = $( this ).text();
                                if ( this.value && ( !request.term || matcher.test(text) ) )
                                    return {
                                        label: text.replace(
                                            new RegExp(
                                                "(?![^&;]+;)(?!<[^<>]*)(" +
                                                $.ui.autocomplete.escapeRegex(request.term) +
                                                ")(?![^<>]*>)(?![^&;]+;)", "gi"
                                            ), "<strong>$1</strong>" ),
                                        value: text,
                                        option: this
                                    };
                            }) );
                        },
                        select: function( event, ui ) {
                            ui.item.option.selected = true;
                            self._trigger( "selected", event, {
                                item: ui.item.option
                            });
                        },
                        change: function( event, ui ) {
                            if ( !ui.item ) {
                                var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "$", "i" ),
                                    valid = false;
                                select.children( "option" ).each(function() {
                                    if ( $( this ).text().match( matcher ) ) {
                                        this.selected = valid = true;
                                        return false;
                                    }
                                });
                                if ( !valid ) {
                                    // remove invalid value, as it didn't match anything
                                    $( this ).val( "" );
                                    select.val( "" );
                                    input.data( "autocomplete" ).term = "";
                                    return false;
                                }
                            }
                        }
                    })
                    .addClass( "ui-widget ui-widget-content ui-corner-left" );
    
                input.data( "autocomplete" )._renderItem = function( ul, item ) {
                    return $( "<li></li>" )
                        .data( "item.autocomplete", item )
                        .append( "<a>" + item.label + "</a>" )
                        .appendTo( ul );
                };              
                
                this.button = $( "<button type='button' class='ui-button ui-widget ui-state-default ui-button-icon-only ui-corner-right ui-button-icon ui-state-hover'><span class='ui-button-icon-primary ui-icon ui-icon-triangle-1-s'></span><span class='ui-button-text'>&nbsp;</span></button>" )
                    .attr( "tabIndex", -1 )
                    .attr( "title", "Show All Items" )
                    .attr( "role", "button" )
                    .attr( "aria-disabled", "false" )
                    .insertAfter( input )
                    .button({
                        icons: {
                            primary: "ui-icon-triangle-1-s"
                        },
                        text: false
                    })
                    .click(function() {
                        // close if already visible
                        if ( input.autocomplete( "widget" ).is( ":visible" ) ) {
                            input.autocomplete( "close" );
                            return;
                        }
    
                        // work around a bug (likely same cause as #5265)
                        $( this ).blur();
    
                        // pass empty string as value to search for, displaying all results
                        input.autocomplete( "search", "" );
                        input.focus();
                    });
            },
    
            destroy: function() {
                this.input.remove();
                this.button.remove();
                this.element.show();
                $.Widget.prototype.destroy.call( this );
            }
        });
    })( jQuery );
    
    $(function() {
        $( "#combobox" ).combobox();
        $( "#toggle" ).click(function() {
            $( "#combobox" ).toggle();
        });
    });
    

    Thanks!

    Jan