views:

46

answers:

1

Hello fellow engineers.

I have come across a problem I just can't solve. I am using autocomplete plugin for jQuery on an input. The HTML looks something like this:

<tr id="row_house" class="no-display">
        <td class="col_num">4</td>
        <td class="col_label">House Number</td>
        <td class="col_data">
            <input type="text" title="House Number" name="house" id="house"/>
            <button class="pretty_button ui-state-default ui-corner-all button-finish">Get house info</button>
        </td>
    </tr>

I am sure that this is the only id="house" field. Other fields that are before this one work fine with autocomplete, and it's basically the same algorithm (other variables, other data, other calls). So why doesn't it work like it should work with the following init. code:

$("#house").autocomplete(["1/4","6","6/1","6/4","8","8/1","8/5","10","10/1","10/3","10/4","12","12/1","12/5","12/6","14","14/1","15","15/1","15/2","15/4","15/5","16","16/1","16/2","16/21","16/2B","16/3","16/4","17","17/1","17/2","17/4","17/5","17/6","17/7","17/8","18","18/1","18/2","18/3","18/5","18/95","19","19/1","19/2","19/3","19/4","19/5","19/6","19/7","19/8","20","20/1","20/2","20/3","20/4","21","21/1","21/2","21/3","21/4","22","22/9","23","23/2","23/4","24","24/1","24/2","24/3","24/A","25","25/1","25/10","25/2","25/4","25/5","25/6","25/7","25/8","25/9","26","26/1","26/6","27","27/2","28","28/1","29","29/2","29/3","29/4","30","30/1","30/2","30/3","31","31/1","31/3","32/A","33","34","34/1","34/11","34/2","34/3","35","35/1","35/2","35/4","36","36/1","36/A","37","37/1","37/2","38","38/1","38/2","39/1","39/2","39/3","39/4","40","40/1","41","41/2","42","43","44","45","45/1","45/10","45/11","45/12","45/13","45/14","45/15","45/16","45/17","45/2","45/3","45/6","45/7","45/8","45/9","46","47","47/2","49","49/1","50","51","51/1","51/2","52","53","54","55/7","66","109","122","190/8","412"], {minChars:1, mustMatch:true}).result(function(event, result, formatted) {
                var found=false;
                for(var index=0; index<HChouses.length; index++) //HChouses is the same array used for init, but each entry is paired with a database ID.
                    if(HChouses[index][0]==result)
                    {
                        found=true;
                        HChouseId=HChouses[index][1];
                        $("#row_house .button-finish").click(function() {  
                            QueryServer("HouseConnect","FillData",true,HChouseId); //this performs an AJAX request
                        });
                        break;
                    }
                if(!found)
                    $("#row_house .button-finish").unbind("click");
            });

Each time I start typing (say I press the "1" button), the text appears and gets deleted instantly. Rarely at all after repeated presses I get the list (although much shorter than it should be)alt text

But if after that I press the second digit, the whole thing disappears again. P.S. I use Firefox 3.6.3 for development.

+1  A: 

It seems like what you're asking is to have a text box using autocompletion, which, when a value is selected, performs some function (QueryServer here) with the id of the selected value. Effectively this is a dynamic ajaxy version of an html <select>. Correct me if that's wrong.

I've done something similar to this recently with jQueryUI autocomplete. You mention in your comments that you've tried this with no luck, but I assume you're interested in a solution using either library. Here's how I would do it:

$("house").autocomplete({
    source: [{'id': 1, 'value': '10/1'}, {'id': 2, 'value': '10/3'}, {'id': 3, 'value': '10/4'}, ....
    minLength: 1,
    select: function(event, ui) {
        //input will auto-populate with "value" part
        $("#row_house .button-finish").click(function() {  
            QueryServer("HouseConnect","FillData",true,ui.item.id);                           
        });
    },
    //this next function is a hack to replicate the "mustMatch" functionality of the bassistance autocomplete plugin
    change: function (event, ui) {
        var source = $(this).val();
        var found = $('.ui-autocomplete li').text().search(source);
        if(found < 0) { //no match!
           $(this).val('');
           $("#row_house .button-finish").unbind("click");
        }            
    }
});

You might want to declare the source values elsewhere to make it a bit neater.

Hope that helps!

Herald_MJ
Thank you a lot for your reply. I did find the feature with object passing instead of simple string to the source of the autocomplete. Haven't got the time right now to go back to that sequence and make it right. The main 2 reasons why I would chose autocomplete plugin over the UI feature are the fact that the text gets highlighted to indicate the matches in the string, and the fact that I can enforce only strict matches, while the UI feature really accepts any string.
Alexander
This is made so as the user can select a house from the database using Autocomplete rather than select (too many houses for a select box), and when a value is selected, that IS present in the database, the button next to the select gets assigned a function that retrieves through AJAX the house information.
Alexander
the 'change' parameter I handed to the autocomplete() function in my example replicates the mustMatch functionality of the plugin - enforcing only strict matches. Bear in mind though, that whichever library you choose to use, they're both server side javascript. A user can simply choose to disable the javascript and submit whatever data they like to the server. The text highlighting is a fair point though.
Herald_MJ
Thank you very much. Now I'll only have to make an optional feature, to highlight the matched fragment(s) in every option.
Alexander
Oh, and this is done not for security (security is managed server-side), but so that I won't have to show an error message like "please select an item that exists in the list" or something like that.
Alexander