0

I've looked through quite a few questions but can't figure this out:

I am strugling with some JS.

I have a config array for a form field character counter, like:

var charwatch = [
  {key: 'headline', value: 60}, 
  {key: 'subheading', value: 40}
];

It represents all the ID's of fields I want to watch, along with their corresponding max character counts.

The actual character counter / limiter works fine - the problem I am having is providing the above data to it.

I am trying to loop through that config and execute a function in each loop, passing key and value each time.

for(p in charwatch) {

  element = charwatch[p].key;
  jq-element = '#'+element;
  count = charwatch[p].value;

  $(jq-element).keyup(function() {
    check_max_chars(element, count); // external function   
    console.log(element);
  });
}

It's kind of working, but I am finding that console.log(element) (in the .keyup function) is always "subheading", never "heading". So everything works exactly as it should for the subheading field, but not at all for the heading field.

2 Answers 2

3

You're running into a common issue that the variable is getting changed and when you later try and reference it it's the last reference, simple example:

for(var i=0; i<10; i++){
    $('#div-' + i).bind('click', function(){ alert(i); }) // will always be 10
}

You need to wrap the inner code in a function so that you create a new scope which saves the values of your variable:

for(var p in charwatch){
    (function( element, count ){
        var jq-element = '#' + element;
        ...
    })( charwatch[p].key, charwatch[p].value );
}

Or you can bind a closure:

$(jq-element).keyup(function( element, count ){
    return function() {
        check_max_chars(element, count); // external function   
        console.log(element);
    }
}( element, count ));

Alternatively, you can wrap your function in a with block, which also creates a closure. This, however, won't be supported in JS strict mode or ES5 (i.e. future versions of JavaScript):

for(p in charwatch) {
    with({ element : charwatch[p].key, count : charwatch[p].value }){
       // existing code
    }
}
Sign up to request clarification or add additional context in comments.

Comments

0

Try this:

$.each(charwatch , function(a, b){
    $("#" + b.key).keyup(function() {     
        check_max_chars(b.key, b.value); // external function        
        console.log(b.key);   
    }); 
})

1 Comment

Javascript error. element not defined in the console.log statement.

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.