Reputation: 175
function loadImages(sources, callback){
var images = {};
var loadedImages = 0;
var numImages = 0;
for (var src in sources) {
numImages++;
}
for (var src in sources) {
images[src] = new Image();
images[src].onload = function(){
if (++loadedImages >= numImages) {
callback(images);
}
};
images[src].src = sources[src];
}
}
window.onload = function(images){
var canvas = document.getElementById("myCanvas");
var context = canvas.getContext("2d");
var sources = {
darthVader: "darth-vader.jpg",
yoda: "yoda.jpg"
};
loadImages(sources, function(images){
context.drawImage(images.darthVader, 100, 30, 200, 137);
context.drawImage(images.yoda, 350, 55, 93, 104);
});
};
function loadImages(sources, callback){
3: two parameters are passed to this function, one being a function in of itself : callback
var images = {};
4: finally, images is set to ... nul(?)
var loadedImages = 0;
var numImages = 0;
// get num of sources
for (var src in sources) {
numImages++;
}
for (var src in sources) {
images[src] = new Image();
images[src].onload = function(){
if (++loadedImages >= numImages) {
callback(images);
5: my brain is confused at this point....
}
};
images[src].src = sources[src];
}
}
window.onload = function(images){
As I understand,
1: the parameter "images" is empty.
var canvas = document.getElementById("myCanvas");
var context = canvas.getContext("2d");
var sources = {
darthVader: "darth-vader.jpg",
yoda: "yoda.jpg"
};
loadImages(sources, function(images){
2: now its being passed as a parameter to this inline functions -- still without pointing to anywhere... it now supposedly calls loadImages method which is defined above...
context.drawImage(images.darthVader, 100, 30, 200, 137);
where doe it get context to darthvader? i only see "sources" have darthVader above
context.drawImage(images.yoda, 350, 55, 93, 104);
});
};
source: http://www.html5canvastutorials.com/tutorials/html5-canvas-image-loader/
EDIT: QUESTIONS::
from step 4: to 5: (specifically in the second for loop), a new array (images[src]) is being created and is passed to the callback() function which is defined as inline just before step 2:. Where does it actually gets images from which were in source?
Upvotes: 1
Views: 1102
Reputation: 91497
I've added comments to your JavaScript inline:
function loadImages(sources, callback){
// "{}" is object literal syntax. images is a new empty object, not null.
var images = {};
var loadedImages = 0;
var numImages = 0;
for (var src in sources) {
numImages++;
}
for (var src in sources) {
// In a for..in loop, the variable (src) is the key of the object (sources).
// The value is retrieved via object[key] (eg, sources[src]).
// In the first iteration of this loop, the images object is given a
// property of "darthVader", and "yoda" in the second iteration.
// Note: images[src] does not create a new array, but adds a property
// named the value of src to images using square bracket notation.
images[src] = new Image();
images[src].onload = function() {
if (++loadedImages >= numImages) {
callback(images); // "callback" is passed images as a parameter
}
};
images[src].src = sources[src];
}
}
// The "images" parameter referenced here is never used. It's pretty pointless.
// It would be an Event object, so calling it "images" is a misnomer.
window.onload = function(images){
var canvas = document.getElementById("myCanvas");
var context = canvas.getContext("2d");
var sources = {
darthVader: "darth-vader.jpg",
yoda: "yoda.jpg"
};
// Don't confuse "images" here with the "images" parameter passed to
// onload. This is the callback's own private parameter. It get's its
// value from the caller.
loadImages(sources, function(images){
context.drawImage(images.darthVader, 100, 30, 200, 137);
context.drawImage(images.yoda, 350, 55, 93, 104);
});
};
Edit: A note on square bracket notation. Given this setup:
var obj = {};
var propertyName = "foo";
The following lines are equivelant:
obj.foo = 1;
obj["foo"] = 1;
obj[propertyName] = 1;
Each of the above lines will add a property named "foo" to obj
.
Upvotes: 1
Reputation: 179096
function loadImages(sources, callback){
//images is set to an object literal
//this is the same as writing "var images = new Object();
var images = {};
//the counter for the number of images loaded
var loadedImages = 0;
//the total number of images
var numImages = 0;
//count the total number of images to load
for (var src in sources) {
numImages++;
}
//iterate through every image in sources
//"src" will be the key used in the object passed to the function (i.e. "yoda")
for (var src in sources) {
//set image[*keyname*] to a new Image object
//i.e. images.yoda = new Image(), images.darthVader = new Image();
images[src] = new Image();
//attach an onload event listener to the image
images[src].onload = function(){
//add one to the number of images loaded
//if the number of images loaded is equal to the total number of images, call the callback
if (++loadedImages >= numImages) {
//pass the object containing the images to load as a parameter of the callback function
callback(images);
}
};
//set the source of the created image to the src provided in the sources object
//i.e. images.yoda.src = sources.yoda
images[src].src = sources[src];
}
}
window.onload = function(images){
//get the canvas
var canvas = document.getElementById("myCanvas");
//get the drawing context of the canvas
var context = canvas.getContext("2d");
//initialize a new object with two sources
//accessible as sources.darthVader and sources.yoda
var sources = {
darthVader: "darth-vader.jpg",
yoda: "yoda.jpg"
};
//load the images in sources using the provided callback function
loadImages(sources, function(images){
//draw the images that were loaded on the canvas
context.drawImage(images.darthVader, 100, 30, 200, 137);
context.drawImage(images.yoda, 350, 55, 93, 104);
});
};
Upvotes: 1
Reputation: 2431
To your first question:
var images = {};
The braces mean in javascript it creates a new object, so it is not NUL but an empty object. An object in Javascript is similar to an array, but it stores key-value-pairs instead of indexed values.
To understand what is happening with the callback:
callback is a function pointer which gets passed to the function "loadImages" by the caller.
source is a parameter to the function which is passed by the caller as well.
In the following line, the image URL is read from this array:
images[src].src = sources[src];
a new array (images[src]) is being created
No, but a new item is created inside the array (an array element).
This loader function has the disadvantage that it does only tell you in the callback that a image has completed -- but it doesn't tell you which one!
Upvotes: 1