views:

83

answers:

4

Hello everybody!

I'm new to javascript and cant get this little thing to work. (all external scripts a of course loaded)

I have this jQuery script:

$('a.Link').click(function(){
    autoComp('City');
});


function autoComp(strFormName) {
    var Company = 'Adobe Apple Microsoft'.split(" ");
    var City = 'London Paris Berlin'.split(" ");
    $('#'+strFormName).autocomplete(strFormName) 
}

I cant get it to work. I've discovered that the problem is the last "strFormName" after .autocomplete

Appreciate all the help I can get.

+3  A: 

You need to change it slightly, like this:

function autoComp(strFormName) {
  var Company = 'Adobe Apple Microsoft'.split(" ");
  var City = 'London Paris Berlin'.split(" ");
  $('#'+strFormName).autocomplete(strFormName == 'City' ? City : Company);
}

The string you passed in and the variable are different things, you need to pick which variable you want based on the string you passed in. Here's an alternative to do it a bit cleaner:

function autoComp(strFormName) {
  var lists = { 
     Company: 'Adobe Apple Microsoft'.split(" "),
     City: 'London Paris Berlin'.split(" ")
  };
  $('#'+strFormName).autocomplete(lists[strFormName]);
}

This creates an object, in javascript you can access it by object.property or object['property'], which your input string is well-suited for :)

Nick Craver
+4  A: 

You're passing the actual value of strFormName into the autocompleter. You probably wanted to do this instead:

function autoComp(strFormName) {
    var data = {
        Company: 'Adobe Apple Microsoft'.split(" "),
        City:    'London Paris Berlin'.split(" ")
    };
    $('#'+strFormName).autocomplete(data[strFormName]);
}

What that does is create an object (data) with two properties, City and Company. Then, when passing the array to the autocompleter, it selects the appropriate array by looking up the property by name, using [] syntax.

JavaScript is very flexible about how you access properties. For example, all of these retrieve the City property of data:

var x = data.City;
var x = data['City'];
var y = "City"; var x = data[y];
var x = data["C" + 'i' + "t" + 'y'];

You get the idea, you can either access a property by using its name literally in the code, or by indexing into the object with [] and giving the property as a string (which can be a string literal, or a string coming from a variable, or expression, or function result, or...).

I'd probably move the data stuff out of autoComp because you don't need to recreate it every time.

T.J. Crowder
Had the same thought I did, +1 this is much cleaner.
Nick Craver
Perfect!I knew it was something with that variable, just not what it was. Thank you very much for the detailed explanation as well. I love this site!!
Andreas
@Andreas: LOL No worries, glad that helps.
T.J. Crowder
A: 

I think I can see your problem. The parameter that you're passing to autocomplete is a string "City"... not the array you think you're passing.

You can eval the string to get the variable.

$('#'+strFormName).autocomplete(eval(strFormName)) ;
Jamiec
Go with T.J. Crowder's solution - its cleaner than my one.
Jamiec
A: 

Are you sure that .autocomplete() needs to be called on strFormName? Should it not be called on strInputName?

$('#idofsometextbox').autocomplete()
Ropstah