5

I am using _renderItem to modify the result list

.data( "autocomplete" )._renderItem = function( ul, item ) {
            var temp = item.url.substring(16, item.url.length)
            return $( "<li></li>" )
            .data( "item.autocomplete", item )
            .append( "<a>" + item.value + "<br>" + item.url + "<br>" + item.description + "<br>" + "Support URL: " + item.support_url + "<br>" + "Contact: " + "<a href=" + item.contact + ">Test</a>" + "<br />" + "</a>"  )
            .appendTo( ul )

This has the behavior of automatically marking up anything that looks like a url as an href. I'd like to make the entire item a link

in an older autocomplete that was done like this:

 .result(function(event, item) {
   location.href = item.url;
  });

But this does not seam to be supported any longer.

Does anyone know how I can either:

1) use something similar to the .result function and just make the entire item a link
or
2) modify the _renderItem so that it is not automatically turning strings that look like URLs into href's

Thank you.

1
  • Can you write code within autocomplete's open event to CHANGE the markup of items already rendered? Commented Jan 27, 2012 at 20:47

3 Answers 3

10

It seems, that this has changed in a previous version. Now you have to use

$element.data('uiAutocomplete')._renderItem()
Sign up to request clarification or add additional context in comments.

2 Comments

Oh, thanks a lot! Shame it is not covered in API docs
This works but the current documented approach is to create your own custom autocomplete by extending widgets. See my answer below.
5

A better approach to customising jQuery's autocomplete is to create your own extended version using widgets.

$.widget( "custom.mySpecialAutocomplete", $.ui.autocomplete, {
  // Add the item's value as a data attribute on the <li>.
  _renderItem: function( ul, item ) {
    return $( "<li>" )
      .attr( "data-value", item.value )
      .append( $( "<a>" ).text( item.label ) )
      .appendTo( ul );
  },
  // Add a CSS class name to the odd menu items.
  _renderMenu: function( ul, items ) {
    var that = this;
    $.each( items, function( index, item ) {
      that._renderItemData( ul, item );
    });
    $( ul ).find( "li:odd" ).addClass( "odd" );
  }
});

var availableTags = [
  "ActionScript",
  "AppleScript",
  "Asp",
  "BASIC",
  "C",
  "C++",
  "Clojure",
  "COBOL",
  "ColdFusion",
  "Erlang",
  "Fortran",
  "Groovy",
  "Haskell",
  "Java",
  "JavaScript",
  "Lisp",
  "Perl",
  "PHP",
  "Python",
  "Ruby",
  "Scala",
  "Scheme"
];

$('#myElement').mySpecialAutocomplete({
  source: availableTags
});

2 Comments

"better approach" -- how about "only approach that works". Everything I tried from older syntaxes I found around the Internet did nothing at all. This widget extension syntax is the only one that worked for me. Thanks for sharing. It's unfortunate that the jQuery docs for _renderItem did not contain a full example like you give here.
Uncaught TypeError: this.source is not a function
3

When you define your autocomplete, use the select function to create your link:

$('selector').autocomplete({
    source: ...,
    select: function(event, ui) { window.location = ui.url; }
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.