You can't call jQuery from JSP code, only from JavaScript.

Your JSP code *generates* JavaScript code, which is what actually calls
jQuery.

In your JSP code, the loop is run in JSP, and it generates a separate block
of JavaScript code each time through the loop. Here is the actual JavaScript
code it generates:

  $('#image1').bind('mouseover',function(event) {
        $('#image1').addClass('dim');
    });

  $('#image2').bind('mouseover',function(event) {
        $('#image2').addClass('dim');
    });

  $('#image3').bind('mouseover',function(event) {
        $('#image3').addClass('dim');
    });

  $('#image4').bind('mouseover',function(event) {
        $('#image4').addClass('dim');
    });

You can see why that code works as expected, since each of the four blocks
is completely self-contained and references the element ID you want it to
use.

The JavaScript code is a different story:

  for (i = 1; i < 5; i++) {
    $('#thumb' + i).bind('mouseover',function(event) {
       $('#thumb' + i).addClass('dim');
    });
  }

Now you're running the loop *in JavaScript*. When you call .bind() each time
through the loop, the variable "i" has the value you expect, 1 through 4 as
you go through the loop.

When this loop terminates, "i" has the value 5.

Much later, when you move the mouse over one of your elements, the event
callback function is called. What is the value of "i" now? 5. There's only a
single variable called "i", and it only contains one value at a time, and
when the loop is finished that value is 5.

Here are a couple of ways to fix it. One is to use a closure:

  for (i = 1; i < 5; i++)
    setThumbMouseover( i );

  function setThumbMouseover( i ) {
    $('#thumb' + i).bind('mouseover',function(event) {
       $('#thumb' + i).addClass('dim');
    });
  }

This code is almost identical to the original, but by calling a function
each time through the loop, those function calls each have their own local
variable named "i". The value of each of those variables is preserved when
the event handler is called later.

Note that the name "i" inside the function is unrelated to the name "i"
outside it. The code would work the same like this:

  for (i = 1; i < 5; i++)
    setThumbMouseover( i );

  function setThumbMouseover( n ) {
    $('#thumb' + n).bind('mouseover',function(event) {
       $('#thumb' + n).addClass('dim');
    });
  }

Either way, this is a great general purpose solution for a lot of similar
problems.

In this particular case, you also have the option of using a simpler
approach. In the event callback, "this" is a reference to the specific
element receiving the event. So you can code it like so:

  for (i = 1; i < 5; i++) {
    $('#thumb' + i).bind('mouseover',function(event) {
       $(this).addClass('dim');
    });
  }

Now there is no longer a reference to the "i" variable in the event
callback, so you avoid the problem completely.

-Mike

> From: kali
> 
> yes I know they are two different things, I do know both JSP 
> and JavaScript, so I do know the difference; I would like to 
> know why what works in JSP doesn't work in JavaScript..  again:
> 
> this works in JSP:
> 
> <%  for (int i = 1; i < 5; i++) { %>
>   $('#image<%=i%>').bind('mouseover',function(event) {
>         $('#image<%=i%>').addClass('dim');
>     });
> <% } %>
> 
> but the same thing, in JavaScript, doesn't work:
> 
> for (i = 1; i < 5; i++) {
>   $('#thumb' + i).bind('mouseover',function(event) {
>      $('#thumb' + i).addClass('dim');
>   });
> }
> 
> in JavaScript this code is applied ONLY when i=5,  in JSP it 
> applies to all four elements processed in the array and works 
> as expected....
> 
> ok, to make it easier, forget the comparison to JSP...   why does
> above JavaScript code not work?? I create four elements 
> dynamically, but event-binding does not work for any of the 
> four elements...
> 
> thank you...
> 
> 
> 
> On Aug 28, 6:56 pm, James <james.gp....@gmail.com> wrote:
> > I have difficulties understanding what you're trying to achieve.
> > As someone mentioned, Java is to Javascript as Ham is to Hamster.
> > They're two different beasts.
> >
> > For the 'elem+1' situation, you can do:
> >     this['elem'+1] = '...';
> > to dynamically create variables. But usually you don't have 
> to resort 
> > to doing something like that if you code things properly.
> >
> > On Aug 28, 12:44 pm, kali <maya778...@yahoo.com> wrote:
> >
> > > hi,
> >
> > > I have a problem with binding events to dynamically-generated 
> > > elements; specif. problem is something I'm trying to do with 
> > > JavaScript doesn't work but it works if I do it inJSP:   
> (and can we 
> > > PLEASE get ability to display CODE in this forum in 
> NON-PROPORTIONAL
> > > FONT???)
> >
> > >JSP, event-binding works:
> > > ------------------------
> >
> > >         <%  for (int i = 1; i < 5; i++) { %>
> > >                 var elem<%=i%> = $('<a id="link<%=i%>"><img 
> > > id="image<%=i %>" /></a>');
> >
> > >                 
> $('#image<%=i%>').bind('mouseover',function(event) {
> > >                                 $('#image<%=i%>').addClass('dim');
> > >                 });
> > >         }
> >
> > > JavaScript, event-binding does not work:
> > > ---------------------------------------
> >
> > > for (i = 1; i < 5; i++) {
> >
> > >   var elem = $('<a id="link<%=i%>"><img id="image<%=i%>" /
> >
> > > ></a>');
> >
> > >   $('#thumb' + i).bind('mouseover',function(event) {
> > >      $('#thumb' + i).addClass('dim');
> > >   });
> >
> > > }
> >
> > > (also: this declaration doesn't work in JS:
> >
> > > var elem+i = $('<a id="link<%=i%>"><img id="image<%=i%>" /></a>');
> >
> > >     ^^^^^^
> >
> > > 'elem+i' returns a syntax error; why does this declaration 'var 
> > > elem< %=i%>' work inJSPbut equivalent does not in JS?
> >
> > > urls (JSPand JS) are here:
> >
> > 
> >http://www.mayacove.com/dev/jquery/events/test_event_dyn.html
> http://w...
> >
> > > thank you very much..
> 

Reply via email to