Adam
Adam

Reputation: 209

Javascript: Combine function argument with string to reference var

I have vars that look like this:

var cardholder = $("#cardholder");
var cardholderInfo = $("#cardholder-Info");

And a function (which doesn't currently work) that looks like this:

function validateRequired(field){
    //if it's NOT valid
    if(field.val().length < 1){
        field.addClass("field_error");
        fieldInfo.text("(Required)");
        fieldInfo.addClass("error");

        return false;
    }
    //if it's valid
    else{
        field.removeClass("field_error");
        fieldInfo.text("");
        fieldInfo.removeClass("error");
        return true;
    }
}

Which I access like:

cardholder.keyup(validateRequired(cardholder));

I've looked everywhere but I can't find what I need and I'm not really sure what I should be searching for.

I can use the field value to access the straight cardholder var. But I also want to use the field value to then reference cardholderInfo so I can manipulate that element in the function.

Upvotes: 0

Views: 202

Answers (4)

HMR
HMR

Reputation: 39320

No need for the global variables:

function validateRequired($cardInfo){
    // You can guess what $cardInfo is
    //if it's NOT valid
    if(this.val().length < 1){
        this.addClass("field_error");
        $cardInfo.text("(Required)");
        $cardInfo.addClass("error");

        return false;
    }
    //if it's valid
    else{
        this.removeClass("field_error");
        $cardInfo.text("");
        $cardInfo.removeClass("error");
        return true;
    }
}


$(document).ready(function(){
  $("#cardholder").keyup(function(){
     validateRequired.call($(this),$("#cardholder-Info"));
  });
});

Upvotes: 2

Derek Henderson
Derek Henderson

Reputation: 9706

You would call the function like this, passing the second parameter:

cardholder.keyup(function () {
    validateRequired(this, cardholderInfo);
});

And modify your function to take a second parameter:

function validateRequired(field, fieldInfo){
    /* validation stuff */
}

Upvotes: 3

Adil
Adil

Reputation: 148150

You have to pass reference of function in keyup, you do not have to call function

cardholder.keyup(function(){
    validateRequired(cardholder)
});

Upvotes: 1

Bergi
Bergi

Reputation: 665111

Don't call the function you want to bind! If you need to pass an argument to it every time it is called, you either need to use bind or a function expression:

cardholder.keyup(functio(e) {
    return validateRequired(cardholder, cardholderInfo);
});

Also you will need a second parameter in your validateRequired function to get the fieldInfo variable filled:

function validateRequired(field, fieldInfo){
    …

Upvotes: 1

Related Questions