I am using jQuery UI Autocomplete with a categorized search result and I want to give it CSS.
Unfortunately, the jQuery user interface doesnβt simplify the work and the default markup hardly works:
<input class="ui-autocomplete-input"/> <ul class="ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all"> <li class='ui-autocomplete-category'>Category 1</li> <li class="ui-menu-item"> <a class="ui-corner-all">item 1</a> </li> <li class="ui-menu-item"> <a class="ui-corner-all">item 2</a> </li> <li class="ui-menu-item"> <a class="ui-corner-all">item 3</a> </li> <li class='ui-autocomplete-category'>Category 2</li> <li class="ui-menu-item"> <a class="ui-corner-all">item 1</a> </li> <li class="ui-menu-item"> <a class="ui-corner-all">item 2</a> </li> <li class="ui-menu-item"> <a class="ui-corner-all">item 3</a> </li> </ul>
The markup I want is this:
<input class="ui-autocomplete-input"/> <ul class="ui-autocomplete ui-catcomplete"> <div class="ui-block"> <div class="ui-autocomplete-category">Category 1</div> <div class="ui-list"> <li class="ui-menu-item"> <a class="ui-corner-all">item 1</a> </li> <li class="ui-menu-item"> <a class="ui-corner-all">item 2</a> </li> <li class="ui-menu-item"> <a class="ui-corner-all">item 3</a> </li> </div> </div> <div class="ui-block"> <div class="ui-autocomplete-category">Category 1</div> <div class="ui-list"> <li class="ui-menu-item"> <a class="ui-corner-all">item 1</a> </li> <li class="ui-menu-item"> <a class="ui-corner-all">item 2</a> </li> <li class="ui-menu-item"> <a class="ui-corner-all">item 3</a> </li> </div> </div> </ul>
And this is when I reach my limit.
I really managed to create markup, but I could no longer select and submit by clicking on an element.
Here is the code I came up with:
$.widget( "custom.catcomplete", $.ui.autocomplete, { _renderMenu: function( ul, items ) { var self = this, currentCategory = "", i = 0; $.each( items, function( index, item ) { if ( item.category != currentCategory ) { ul.append( "<div class='ui-autocomplete-category'>" + item.category + "</div>"); currentCategory = item.category; } self._renderItem( ul, item ); }); ul.find('.ui-autocomplete-category').each(function() { $(this).nextUntil('div') .andSelf() .wrapAll('<div class="ui-block">') .nextUntil('div') .wrapAll('<div class="ui-list">'); }); }, _renderItem: function( ul, item) { return $( "<li></li>" ) .data( "item.autocomplete", item ) .append( "<a>" + item.label + "</a>" ) .appendTo( ul ); }, }); $(function() { $( "#ui-autocomplete-input" ).catcomplete({ source: '<?php echo SITEURL?>/users/complete/', delay: 0, autoFocus: true, select: function(event, ui) { if(ui.item) { $('#ui-autocomplete-input').attr('value',ui.item.value); } $('#ui-autocomplete-form').submit(); } }); });
Thus, the select: function part does not work at all.
Can anyone help me with this?
I am sure there is an easy way to change the default markup and make it work fine.
Here is what I want it to look like this:
