// JavaScript Document /* * jQuery preloadImages plugin * Version 0.1.1 (20/12/2007) * @requires jQuery v1.2.1+ * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * * @name preloadImages * @type jQuery * @cat Plugins/Browser Tweaks * @author Blair McBride */ (function($) { /** * * Queue up a list of images, and start preloading them. * Works with multi-dimensional arrays. * * @example $.preloadImages(['1.jpg', '2.jpg', '3.jpg']); * @example $.preloadImages(['1.jpg', '2.jpg', '3.jpg', ['4.jpg', '5.jpg']]); * * @param arr Any number of image URLs to preload, in an array. */ $.preloadImages = function(arr) { $.preloadImages.add(arr); queuedStop = false; startPreloading(); }; /** * Add a list of images to the end of the preload queue. * Does not start precoessing the queue, unlike $.preloadImages() * Works with multi-dimensional arrays. * * @example $.preloadImages.add(['1.jpg', '2.jpg', '3.jpg']); * @example $.preloadImages.add(['1.jpg', '2.jpg', '3.jpg', ['4.jpg', '5.jpg']]); * * @param arr Any number of image URLs to preload, either as individual arguments or in an array. */ $.preloadImages.add = function(arr) { if(typeof(arr) == 'string') { $.preloadImages.imageQueue.push(arr); return; } if(arr.length < 1) return; for(var i = 0, numimgs = arr.length; i < numimgs; i++) { if(typeof(arr[i]) == 'string') $.preloadImages.imageQueue.push(arr[i]); else if(typeof(arr[i]) == 'object' && arr[i].length > 0) $.preloadImages.add(arr[i]); } } /** * Prepend a list of images to the start of the preload queue. * Does not start precoessing the queue, unlike $.preloadImages() * Works with multi-dimensional arrays. * * @example $.preloadImages.add('1.jpg', '2.jpg', '3.jpg'); * @example $.preloadImages.add(['1.jpg', '2.jpg', '3.jpg'], ['4.jpg', '5.jpg']); * * @param Any number of image URLs to preload, either as individual arguments or in an array. */ $.preloadImages.prepend = function() { if(typeof(arr) == 'string') { $.preloadImages.imageQueue.unshift(arr); return; } if(arr.length < 1) return; for(var i = numargs - 1; i >= 0; i--) { if(typeof(arr[i]) == 'string') $.preloadImages.imageQueue.unshift(arr[i]); else if(typeof(arr[i]) == 'object' && arr[i].length > 0) $.preloadImages.prepend(arr[i]); } } /** * Clear the preload queue. */ $.preloadImages.clear = function() { $.preloadImages.imageQueue = []; } /** * Stop processing the preload queue. Does not clear the queue, so precessing can be started off from where it was stopped. */ $.preloadImages.stop = function() { queuedStop = true; } /** * Start processing the preload queue. */ $.preloadImages.start = function() { queuedStop = false; startPreloading(); } /** * The preload queue, for direct manupilation of the queue. * Items at the start of the queue will be processed first. * This needs to be kept single-dimensional. */ $.preloadImages.imageQueue = []; /* PRIVATE */ var isPreloading = false; var queuedStop = false; function startPreloading() { if(isPreloading) return; $(document.createElement('img')).bind('load', function() { if(queuedStop) { queuedStop = isPreloading = false; return; } isPreloading = true; if($.preloadImages.imageQueue.length > 0) { this.src = $.preloadImages.imageQueue.shift(); } else isPreloading = false; }).trigger('load'); } })(jQuery);