Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you cache an image in Javascript

My friends and I are working on a website where we would like to cache certain images in order to display them faster in the future. I have two main questions:

  1. How do you cache an image?
  2. How do you use an image once it has been cached? (and just to verify, if an image is cached on page A, it is possible to call it from the cache to use it on page B, right?)

Also, is it possible to set when the cached version of the image will expire?

It would be much appreciated if an example and/or a link to a page which describes this further was included.

We're fine using either raw Javascript or the jQuery version.

like image 787
Logan Besecker Avatar asked Apr 20 '12 04:04

Logan Besecker


People also ask

Can images be cached?

Once an image has been loaded in any way into the browser, it will be in the browser cache and will load much faster the next time it is used whether that use is in the current page or in any other page as long as the image is used before it expires from the browser cache.

What is image caching?

When you cache an image service, the server draws the image at a set of scale levels and pixel sizes that you define and saves the preprocessed (cached) images. So, when the server receives a request for an image, it's much quicker to return one of these cached images than to draw the original image again.

How do I cache a static image?

Here is what you need to remember while caching static resources on CDN or local cache server: Use Cache-control HTTP directive to control who can cache the response, under which conditions, and for how long. Configure your server or application to send validation token Etag. Do not cache HTML in the browser.


1 Answers

Once an image has been loaded in any way into the browser, it will be in the browser cache and will load much faster the next time it is used whether that use is in the current page or in any other page as long as the image is used before it expires from the browser cache.

So, to precache images, all you have to do is load them into the browser. If you want to precache a bunch of images, it's probably best to do it with javascript as it generally won't hold up the page load when done from javascript. You can do that like this:

function preloadImages(array) {     if (!preloadImages.list) {         preloadImages.list = [];     }     var list = preloadImages.list;     for (var i = 0; i < array.length; i++) {         var img = new Image();         img.onload = function() {             var index = list.indexOf(this);             if (index !== -1) {                 // remove image from the array once it's loaded                 // for memory consumption reasons                 list.splice(index, 1);             }         }         list.push(img);         img.src = array[i];     } }  preloadImages(["url1.jpg", "url2.jpg", "url3.jpg"]); 

This function can be called as many times as you want and each time, it will just add more images to the precache.

Once images have been preloaded like this via javascript, the browser will have them in its cache and you can just refer to the normal URLs in other places (in your web pages) and the browser will fetch that URL from its cache rather than over the network.

Eventually over time, the browser cache may fill up and toss the oldest things that haven't been used in awhile. So eventually, the images will get flushed out of the cache, but they should stay there for awhile (depending upon how large the cache is and how much other browsing is done). Everytime the images are actually preloaded again or used in a web page, it refreshes their position in the browser cache automatically so they are less likely to get flushed out of the cache.

The browser cache is cross-page so it works for any page loaded into the browser. So you can precache in one place in your site and the browser cache will then work for all the other pages on your site.


When precaching as above, the images are loaded asynchronously so they will not block the loading or display of your page. But, if your page has lots of images of its own, these precache images can compete for bandwidth or connections with the images that are displayed in your page. Normally, this isn't a noticeable issue, but on a slow connection, this precaching could slow down the loading of the main page. If it was OK for preload images to be loaded last, then you could use a version of the function that would wait to start the preloading until after all other page resources were already loaded.

function preloadImages(array, waitForOtherResources, timeout) {     var loaded = false, list = preloadImages.list, imgs = array.slice(0), t = timeout || 15*1000, timer;     if (!preloadImages.list) {         preloadImages.list = [];     }     if (!waitForOtherResources || document.readyState === 'complete') {         loadNow();     } else {         window.addEventListener("load", function() {             clearTimeout(timer);             loadNow();         });         // in case window.addEventListener doesn't get called (sometimes some resource gets stuck)         // then preload the images anyway after some timeout time         timer = setTimeout(loadNow, t);     }      function loadNow() {         if (!loaded) {             loaded = true;             for (var i = 0; i < imgs.length; i++) {                 var img = new Image();                 img.onload = img.onerror = img.onabort = function() {                     var index = list.indexOf(this);                     if (index !== -1) {                         // remove image from the array once it's loaded                         // for memory consumption reasons                         list.splice(index, 1);                     }                 }                 list.push(img);                 img.src = imgs[i];             }         }     } }  preloadImages(["url1.jpg", "url2.jpg", "url3.jpg"], true); preloadImages(["url99.jpg", "url98.jpg"], true); 
like image 192
jfriend00 Avatar answered Sep 20 '22 03:09

jfriend00