The solution you want is the canvas.
Only with it you'll have the (easy) possibility to use one single -or a reduced set- of graphic files that you'll use for your animations.
Since you can't afford to have a thousand files to download you'll in fact need to handle packed files, which may look like :
Several characters or any graphic can be packed in such file.
Once you loaded the image, you have to compute the texture coordinates for each frame.
An animation is a sequence of frame.
The key method of the canvas here is drawImage, which comes in a 9 arguments flavor that allows to clip/resize/... the image.
I've done a little fiddle to illustrate, but you should seriously consider using a framework for the animation, it might provide you most valuable tool (animation transition, to quote one).
fiddle here : http://jsfiddle.net/gamealchemist/Vn2Nt/
// array containig texture coords of all frames.
var textureCoords = [];
// fill the textureCoords using image img, assuming
// frames are tiled in a 'regular way', sized tw X th,
// uses only cnt frames.
function fillTextureCoords(img, tw, th, cnt) {
var w = img.width,
h = img.height;
var hCount = Math.floor(w / tw),
vCount = Math.floor(h / th);
for (var vIndex = 0; vIndex < vCount; vIndex++)
for (var hIndex = 0; hIndex < hCount; hIndex++) {
textureCoords.push({
u: hIndex * tw,
v: vIndex * th,
w: tw,
h: th
});
cnt--;
if (!cnt) return;
}
}
// frames of the animation.
// Contains index to the textureCoords array.
var frames = [];
for (var i = 0; i < 14; i++) frames.push(i);
// duration of a single frame.
var frameDuration = 150;
// current time of the animation (ms).
var animationStatus = 0;
// draws at (0,0) the current animation frame
function drawThatFrame() {
var whichFrame = Math.floor(animationStatus / frameDuration);
whichFrame %= frames.length;
var tCoord = textureCoords[frames[whichFrame]];
context.drawImage(myBird, tCoord.u, tCoord.v, tCoord.w, tCoord.h, 0, 0, tCoord.w, tCoord.h);
}