Hi,

I've set up a simple extension for an image rotator. It looks like
this:

jQuery.fn.imageRotate = function(delay,speed) {
                // Converted s into ms
                delay = delay * 1000;
                // Get all child items of the list
                var targetItems = $(this).children();
                // Hide all except first item (and store the first item as
targetItem)
                var targetItem = targetItems.hide().slice(0,1).show();
                // Set a JS timeout for next rotation
                setTimeout(function(){
                        $(this).imageRotateNext(targetItem,delay,speed);
                },delay);
        };

jQuery.fn.imageRotateNext = function(targetItem,delay,speed) {
                nextTarget = targetItem.next();
                if (!nextTarget.is("li")) {
                        // Get first child of the list by slicing first element 
of
collection
                        nextTarget = $(this).children().slice(0,1);
                        // Move it to the end of the list
                        $(this).append(nextTarget);
                }
                nextTarget.fadeIn(speed,function(){
                        // Previous item will be hidden on fade completion
                        targetItem.hide();
                });
                setTimeout(function(){$
(this).imageRotateNext(nextTarget,delay,speed)},delay);
};

The HTML markup is a plain unordered list, with each list item
containing one image. If you call $
("ul#myList1").imageRotate(2,"fast") the extension hides all except
the first image, then starts fading each one in over the top after the
specified number of seconds (delay).

It works beautifully when just one image is rotating. Once I get more
than one on the page at once, however, images start intermittently
disappearing.

It seems like it's being caused by the *other* list; meaning, when an
image from the *second* list fades in, the current image in the
*first* list gets hidden.

I conclude that the targetItem.hide() which gets called on completion
of fadeIn is causing the problem. It should be hiding the image in the
second list, but by the time the callback is performed, targetItem is
now referring to the targetItem from the *first* list, so that gets
hidden instead.

I hope this is clear so far !

So really, I think I understand the problem, I'd just like to know
other people's recommendations for how to solve this type of problem,
namely Javascript variable scope within callback functions. How do I
set up a callback that will have a reference to the object this
variable holds *now*, rather than the reference it points to *when*
the callback is raised? I've come up against this issue a few times,
so I think understanding this solution might help me in quite a few
places.

Thank you kindly,
Pete Hurst

Reply via email to