Re: Image preloading

Christophe Decaux
2010-04-11T17:42:21Z

I''m just a rails amateur, but I''ve been dealing with Prototype
stuff a bit
longer and I bumped into this image preloading stuff already.
I don''t clearing understand what you want to do while your images are
preloading and also what you want to do once they are preloaded and this is
pretty crucial as this may last some time. You''ll never know.
And in addition your code is too simplistic.

So take a look at this that I posted to the ProtoScripty group a while ago:
====================================================
I think the following code should help you, I found it sometime ago it
is based on this page :
http://www.webreference.com/programming/javascript/gr/column3/<http://www.google.com/url?sa=D&q=http://www.webreference.com/programming/javascript/gr/column3/&usg=AFQjCNFzGhxZUss7TN6EJ8L7Yt4qIqydAA>

Basically, you need to have
        - an array with url''s for your big images such as picSrc[0]
''images/
big1.jpg''; picSrc[1] = ''images/big3.jpg''
- a hidden in your page which
displays your
waiting message

When you want to load your big images you call these two lines:

$(''waitingPic'').show()
initPics()

Here''s the code

function initPics(){
        var ImagePreLoader = Class.create({
                callback: null,
                imageCache: new Array,
                loaded: 0,
                processed: 0,
                noOfImages: 0,
                initialize: function(images, options) {
                        if (options) {
                                if (options.callback) this.callback
options.callback;
                        }

                        this.noOfImages = images.length;
                        for ( var i = 0; i < images.length; i++ )
                      this.*preload*(images[i]);
                },
                *preload*: function(imgSrc) {
                        var image = new Image;
                        this.imageCache.push(image);
                        Event.observe(image, ''load'',
this.onload.bindAsEventListener(this),
false);
                        Event.observe(image, ''error'',
this.onerror.bindAsEventListener
(this), false);
                        Event.observe(image, ''abort'',
this.onabort.bindAsEventListener
(this), false);
                        image.preloader = this;
                        image.loaded = false;
                        image.src = imgSrc;
                },
                onComplete: function() {
                        this.processed++;
                        if (this.processed==this.noOfImages) {
                                this.callback(this.imageCache,
this.loaded);
                        }
                },
                onload: function(e) {
                        this.loaded++;
                        this.onComplete();
                },
                onerror: function(e) {
                        this.onComplete();
                },
                onabort: function(e) {
                        this.onComplete();
                }
        });

        var imgPreloadCallback = function(imageCache, loaded) {
            // where:
            //     imageCache is an array of the loaded images
            //     loaded is an int of the number of images that loaded.
            //doSomethingAfterImagesAreLoaded();
                $(''waitingPic'').hide();
                picsPreLoaded = true;
        }

        var imgLoader = new ImagePreLoader(picSrc,
{callback:imgPreloadCallback});

}

Hope this helps.

Christophe


2010/4/10 ChaosKnight <rvanhoepen-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

> Hi, I am still very new to Ruby on Rails, but I''m busy with my
first
> RoR website, everything went well, until I realized that my images
> didn''t preload... On previous websites I used a simple JavaScript
> preloader that seemed to work very well:
>
>    function preloadImages() {
>      if (document.images) {
>        var imgFiles = preloadImages.arguments;
>        var preloadArray = new Array();
>        for (var i=0; i < imgFiles.length; i++) {
>          preloadArray[i] = new Image;
>          preloadArray[i].src = imgFiles[i];
>       }
>     }
>   }
>
> And I called it from within the HTML:
>
>    <body
onload="preloadImages(''/images/home.png'',....etc....)
>
> This is how I called the image rollover in the Rails code:
>    <%= link_to(image_tag(''home.png'',
:mouseover=>"home_ro.png"), ''/'',
> {:controller=>''home'',
:action=>''index''}) %>
>
> Can anyone please tell me why this didn''t work? I also heard that
> Prototype has it''s own built-in image preloader, is this true?
>
> Thanks I really appreciate your help!
>
> --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Talk" group.
> To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
> To unsubscribe from this group, send email to
>
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org<rubyonrails-talk%2Bunsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
> .
> For more options, visit this group at
> http://groups.google.com/group/rubyonrails-talk?hl=en.