Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does autocomplete request/server response look like?

This seems to be a black hole: After an hour of searching the jQuery UI website, Stack Overflow, and googling, I've yet to find the most basic information of how to write the server side of the AutoComplete.

What parameter is passed to the server and what should the JSON response look like?

I must be missing something, because how did everyone else learn how to do this? Sites only seem to discuss the client-side JavaScript code and never the protocol or server-side examples.

I need enough to get the simplest remote example working.

like image 412
Pete Alvin Avatar asked Feb 22 '11 11:02

Pete Alvin


People also ask

How do I know if autocomplete dropdown is open?

If autocomplete dropdown is open, Esc press shoult perform its default action only (closing dropdown and cancelling selection). How to check if autocomplete dropdown was opened ? It can check for any autocomplete box was opened in document body.

What is autocomplete and its working nature?

Auto completion is a mechanism frequently used in modern websites to provide the user with a list of suggestions for the beginning of the word, which he/she has typed in a text box. The user can then select an item from the list, which will be displayed in the input field.


2 Answers

What parameter is passed to the server

You need to pass request.term to your server-side code (from the documentation):

A request object, with a single property called "term", which refers to the value currently in the text input.

Basically, in your autocomplete code, you'll have something like this:

$("#autocomplete").autocomplete({     // request.term needs to be passed up to the server.     source: function(request, response) { ... } }); 

and what should the JSON response look like?

The autocomplete widget expects an array of JSON objects with label and value properties (although if you just specify value, it will be used as the label). So in the simplest case, you can just return data that looks like this:

[     { label: 'C++', value: 'C++' },      { label: 'Java', value: 'Java' }     { label: 'COBOL', value: 'COBOL' } ] 

If you need something more complicated, you can use the success argument of the $.ajax function to normalize the data you get back before the autocomplete gets it:

source: function( request, response ) {     $.ajax({         /* Snip */         success: function(data) {             response($.map( data.geonames, function( item ) {                 return {                     label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,                     value: item.name                 }             }));          }     }); 

This code is taken from the example here (This is a good example overall of ajax + autocomplete works in a more complex scenario).

Basically, what's going is that upon a successful ajax request, the data received is being normalized (using $.map) to what the autocomplete widget expects.

Hope that helps.

like image 138
Andrew Whitaker Avatar answered Sep 20 '22 05:09

Andrew Whitaker


In addition to Andrew Whitaker's perfect answer, an alternative method to $.map is to override the renderer, an example of which is shown on the jQuery UI Demo page.

I have used this functionality using a JSON call like so:

JSON Response

{    "Records": [        {            "WI_ID": "1",            "Project": "ExampleProject",            "Work_Item": "ExampleWorkItem",            "Purchase_Order": "",            "Price": "",            "Comments": "",            "Quoted_Hours": "",            "Estimated_Hours": "",            "Achieved": "False",            "Used_Hours": "0"        }    ] } 

jQuery

$("#WorkItem").autocomplete({       source: function(request, response){            $.ajax({                type: "POST",                url: "ASPWebServiceURL.asmx/WorkItems",                data: "{'Project_ID':'1'}",                contentType: "application/json; charset=utf-8",                dataType: "json",                success: function (msg) {                    response($.parseJSON(msg.d).Records);                },                error: function (msg) {                    alert(msg.status + ' ' + msg.statusText);                }            })        },         select: function (event, ui) {            $("#WorkItem").val(ui.item.Work_Item);            return false;        } }) .data("autocomplete")._renderItem = function (ul, item) {     return $("<li></li>")     .data("item.autocomplete", item)     .append("<a>" + item.Work_Item + "</a>")     .appendTo(ul); }; 

In this example, the _renderItem function is overridden so that the search result list (i.e, the list that appears under the textbox) is filled using attributes of the records that I retrieved from the JSON response.

Whilst not as simple, it allows you to pull off some pretty interesting stuff (using multiple bits of data from a JSON response, for example)

like image 23
James Boyden Avatar answered Sep 20 '22 05:09

James Boyden