ImageQueueLoader is a little module for creating a queue of images to pre-load, and be able to switch order of images fast. It is not dependant on any library and should work in all browsers,...in theory. Tests results welcome, if you want to help (see "testing", below).
Here is an example of usage (it uses jQuery for convenience):
<html><head><title>Testing</title></head><body>
<div id="Images">
<div data-src="some-image.jpg" class="image"></div>
<div data-src="some-image2.jpg" class="image"></div>
</div>
</body></html>
var images = [];
//collecting all the images
var $images = $('.image').each(function(){
images.push($(this).data('src'));
});
var loader = new PicLoader(images)
.limit(3) //3 concurrent images will be downloaded
.on(PicLoader.events.LOADED,function(image){
if(!image){return false;}
var src = image.src.replace('http://localhost/','')
$('data-src="'+src+'"').addClass('loaded').css('background-image','url('+image.src+')');
})
;
//bump images that are in view
$images.inView(function(){ //(using an hypothetical inView plugin...)
loader.add($(this).data('src'))
});
loader.start();
or, if you want more callbacks:
var loader = new PicLoader().limit(3);
//collecting all the images
var $images = $('.image').each(function(){
var $el = $(this)
, src = $el.data('src')
;
loader.add(src,function(image){
if(image){
$el.addClass('loaded').css('background-image','url('+src+')')
}else{
$el.addClass('error')
}
});
});
//bump images that are in view
$images.inView(function(){ //(using an hypothetical inView plugin...)
loader.add($(this).data('src'))
});
loader.start();
PicLoader exposes an UMD interface, so it should work with require(), define(), or whatever. It exposes the global PicLoader when used as a regular javascript file. So use bower, use npm, use browserify, or include the js file...Feel free.
You will find more info in the test suite (/test/test.js), but here below are the important points
starts the queue. Optionally calls the passed callback.
prepends one or more items to the queue. "source" can be an array or a string.
loader.add('source','source',['source','source'])
It can also be used to add a source to load and fire a function when loaded. You can pass multiple couples:
loader.add('source',fn,'source',fn)
//or
loader.add(['source',fn],['source',fn])
//or a mix
loader.add(['source',fn,'source',fn],'source',fn,'source',fn)
finally, it can be used to bump an image to top
loader.add('a.jpg','b.jpg','c.jpg','d.jpg')
loader.add('c.jpg') //c will now load before everything else
add() can also be fed objects, but make sure they have a "src" property
loader.add({name:'my image',src:'my_image.jpg'})
does the same as add(), but added items are queued instead of pre-pended
Sets the maximum number of concurrent downloads. Defaults to 1.
(aliased to addEventListener) Run the given function when event is triggered
runs the function once then removes it
Stops listening to the event. If you do not pass the function that was used when on() was called, all listeners for a given event are removed.
- Loader.events.LOADED
= 'loaded'
called after each image load. Receives the DOM img element that has loaded - Loader.events.LOADING
= 'loading'
called before loading an image. Receives the source - Loader.events.COMPLETE
= 'complete'
called when all images in queue have been loaded. - Loader.events.ERROR
= 'error'
called when an image fails to load - Loader.events.PROMOTED
= 'promoted'
called when an image is promoted to the top of the queue
Run
Tests run in the browser and require Chai and Mocha. Run:
npm install
Then
npm test
which will open a server on port 7357 Open http://localhost:7357 in your browser to run the tests.
MIT
Some random images have been included in the repo for testing. They have not been verified as royalty-free. If there is any problem on copyright, leave an issue and we'll remove the image presto.