5 <title>jQuery UI Autocomplete - Combobox</title>
6 <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
7 <script src="../../jquery-1.9.1.js"></script>
8 <script src="../../ui/jquery.ui.core.js"></script>
9 <script src="../../ui/jquery.ui.widget.js"></script>
10 <script src="../../ui/jquery.ui.button.js"></script>
11 <script src="../../ui/jquery.ui.position.js"></script>
12 <script src="../../ui/jquery.ui.menu.js"></script>
13 <script src="../../ui/jquery.ui.autocomplete.js"></script>
14 <script src="../../ui/jquery.ui.tooltip.js"></script>
15 <link rel="stylesheet" href="../demos.css">
19 display: inline-block;
38 $.widget( "ui.combobox", {
40 this.wrapper = $( "<span>" )
41 .addClass( "ui-combobox" )
42 .insertAfter( this.element );
44 this._createAutocomplete();
45 this._createShowAllButton();
48 _createAutocomplete: function() {
49 var selected = this.element.children( ":selected" ),
50 value = selected.val() ? selected.text() : "";
52 this.input = $( "<input>" )
53 .appendTo( this.wrapper )
56 .addClass( "ui-state-default ui-combobox-input ui-widget ui-widget-content ui-corner-left" )
60 source: $.proxy( this, "_source" )
63 tooltipClass: "ui-state-highlight"
66 this._on( this.input, {
67 autocompleteselect: function( event, ui ) {
68 ui.item.option.selected = true;
69 this._trigger( "select", event, {
74 autocompletechange: "_removeIfInvalid"
78 _createShowAllButton: function() {
82 .attr( "tabIndex", -1 )
83 .attr( "title", "Show All Items" )
85 .appendTo( this.wrapper )
88 primary: "ui-icon-triangle-1-s"
92 .removeClass( "ui-corner-all" )
93 .addClass( "ui-corner-right ui-combobox-toggle" )
94 .mousedown(function() {
95 wasOpen = input.autocomplete( "widget" ).is( ":visible" );
100 // Close if already visible
105 // Pass empty string as value to search for, displaying all results
106 input.autocomplete( "search", "" );
110 _source: function( request, response ) {
111 var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
112 response( this.element.children( "option" ).map(function() {
113 var text = $( this ).text();
114 if ( this.value && ( !request.term || matcher.test(text) ) )
123 _removeIfInvalid: function( event, ui ) {
125 // Selected an item, nothing to do
130 // Search for a match (case-insensitive)
131 var value = this.input.val(),
132 valueLowerCase = value.toLowerCase(),
134 this.element.children( "option" ).each(function() {
135 if ( $( this ).text().toLowerCase() === valueLowerCase ) {
136 this.selected = valid = true;
141 // Found a match, nothing to do
146 // Remove invalid value
149 .attr( "title", value + " didn't match any item" )
151 this.element.val( "" );
152 this._delay(function() {
153 this.input.tooltip( "close" ).attr( "title", "" );
155 this.input.data( "ui-autocomplete" ).term = "";
158 _destroy: function() {
159 this.wrapper.remove();
166 $( "#combobox" ).combobox();
167 $( "#toggle" ).click(function() {
168 $( "#combobox" ).toggle();
175 <div class="ui-widget">
176 <label>Your preferred programming language: </label>
177 <select id="combobox">
178 <option value="">Select one...</option>
179 <option value="ActionScript">ActionScript</option>
180 <option value="AppleScript">AppleScript</option>
181 <option value="Asp">Asp</option>
182 <option value="BASIC">BASIC</option>
183 <option value="C">C</option>
184 <option value="C++">C++</option>
185 <option value="Clojure">Clojure</option>
186 <option value="COBOL">COBOL</option>
187 <option value="ColdFusion">ColdFusion</option>
188 <option value="Erlang">Erlang</option>
189 <option value="Fortran">Fortran</option>
190 <option value="Groovy">Groovy</option>
191 <option value="Haskell">Haskell</option>
192 <option value="Java">Java</option>
193 <option value="JavaScript">JavaScript</option>
194 <option value="Lisp">Lisp</option>
195 <option value="Perl">Perl</option>
196 <option value="PHP">PHP</option>
197 <option value="Python">Python</option>
198 <option value="Ruby">Ruby</option>
199 <option value="Scala">Scala</option>
200 <option value="Scheme">Scheme</option>
203 <button id="toggle">Show underlying select</button>
205 <div class="demo-description">
206 <p>A custom widget built by composition of Autocomplete and Button. You can either type something into the field to get filtered suggestions based on your input, or use the button to get the full list of selections.</p>
207 <p>The input is read from an existing select-element for progressive enhancement, passed to Autocomplete with a customized source-option.</p>
208 <p>This is not a supported or even complete widget. Its purely for demoing what autocomplete can do with a bit of customization. <a href="http://www.learningjquery.com/2010/06/a-jquery-ui-combobox-under-the-hood">For a detailed explanation of how the widget works, check out this Learning jQuery article.</a></p>