Asking your question of my javascipt list, the responses were as follows:
Repsonse 1 ****
Have you tried this?
objA.onclick = new Function ("alert(" + intI + ")" );
Response 2 ****
>for (var intI = 0 ; intI < 10 ; intI++){
>> var objA = document.createElement( "div" );
Place one "var objA;" before the loop then remove the "var" inside.
Redeclaring a variable is a bad practice that will bite you in other
languages.
>> objA.onclick = function(){ alert( intI ); };
It's doing its job, it's alerting the value of intI, which is what you left
it. The easiest solution is to add a custom property to the object to hold
the current value of intI:
objA.currentI = intI;
objA.onclick = function(){ alert( this.currentI ); };
Response 3 ****
>objA.onclick = new Function ("alert(" + intI + ")" );
This should work, but from what I understand new Function (like eval) must
be compiled on the spot, so there's a (however slight) performance hit.
http://userjs.org/help/tutorials/efficient-code
Hope some of this helps
Cutter
Ben Nadel wrote:
> Not really for CF, but though someone here could lend some insight....
>
> There is one problem in Javascript that I cannot seem to get a handle on and
> it is killling me! I can't seem to get variables to pass by value as I would
> hope. Take the following example:
>
> for (var intI = 0 ; intI < 10 ; intI++){
> var objA = document.createElement( "div" );
>
> // Set the click for the link.
> objA.onclick = function(){ alert( intI ); };
>
> // Set the link into the body div.
> objDiv.appendChild( objA );
> }
>
> Now, in my head, each one of those links, when clicked should alert the
> appropriate intI value (0, 1, 2, 3, etc.); however, each of them will alert
> 10 which is the value that broke the FOR loop. It's like they all point to
> one variable and then get updated for each loop of the FOR iteration.
>
> I can't seem to find a good solution to this. One method that seems to work,
> but is poop is something along the lines of:
>
> // Define a function INSIDE this function.
> function GetI( intX ){
> return(
> function(){ alert(intX); };
> );
> }
>
> for (var intI = 0 ; intI < 10 ; intI++){
> var objA = document.createElement( "div" );
>
> // Set the click for the link.
> objA.onclick = GetI( intX );
>
> // Set the link into the body div.
> objDiv.appendChild( objA );
> }
>
> This method works as would be expected, though I seem to think that it is
> doing the exact same thing. It must be something to do with the scoping.
> Since the intI value is getting passed to a local scope (int GetI()), and
> then getting passed back, it must be unique (since the local scope of the
> GetI() method is created unique of each FOR iteration.
>
> This solution seems truly ganky to me. There has to be a better way. And
> this is just a simple example. I have many places where I want to be doing
> this with object reference and dynamic event handling. This one simple bumb
> is really holding me back!
>
> Please help!!!
> .......................
> Ben Nadel
> www.bennadel.com
>
>
>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Message: http://www.houseoffusion.com/lists.cfm/link=i:4:238310
Archives: http://www.houseoffusion.com/cf_lists/threads.cfm/4
Subscription: http://www.houseoffusion.com/lists.cfm/link=s:4
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4
Donations & Support: http://www.houseoffusion.com/tiny.cfm/54