As an alternative to the other solution you posted, here is how you can do
it with code more like the code below:

for(var i = 0; i < 30; i++)
  clicker( i );

function clicker( i ) {
  jQuery('#day_' + i).click(function() {
    console.log('i is ' + i);
    jQuery('#day_' + i + '_modal').jqmShow();
  });
}

As you can see, all I changed was to put your code inside a function and
call that function 30 times.

Why did your original code show "i is 30" for each element? Because there is
only a single variable "i", and when you call console.log it's using the
current value of "i" - not the value that "i" had at the time you added the
click event.

By moving this code into a function, a new variable "i" is created each time
the function is called. You no longer have all the code sharing a single
variable - each instance of the function gets its own.

-Mike

> From: Rabbit
> 
> The following code:
> 
> for(var i = 0; i < 30; i++) {
>   jQuery('#day_' + i).click(function() {
>     console.log('i is ' + i);
>     jQuery('#day_' + i + '_modal').jqmShow();
>   });
> }
> 
> Runs, but always reports "i is 30".
> 
> Now, I understand why it does that, but why doesn't the 
> jqmShow method work? It appears as though the code that "gets 
> executed" is dynamic.
> In other words, when the click event occurs JavaScript looks 
> up the code as it was at the end of its execution, when 
> variable i is 30, instead of "remembering" that at one point 
> it was something else.
> 
> Did that make sense?
> 
> Any ideas how to get around this without typing in all 30 
> click events?
> 

Reply via email to