<img src="img.gif" name="myImage" width=100 height=100>
you can address it through document.myImage or document.images["myImage"].
Although it is nice to know how to get the size of an image on a web-page this is not what we wanted to know. We want to change images on a web-page. For this purpose we need the src property. As in the <img> tag the src property represents the address of the displayed image. With JavaScript 1.1 you can now assign new addresses to an already loaded image on a web-page. The result is that the image located at the new address is being loaded. This new image replaces the old image on the web-page. Look at this example:
<img src="img1.gif" name="myImage" width=100 height=100>
The image img1.gif is being loaded and gets the name myImage. The following line of code replaces the old image img1.gif with the new image img2.gif:
document.myImage.src= "img2.src";
The new image has always got the same size as the old image. You cannot change the size of the area in which the image is being displayed. You can test this example through clicking on the following button (works only once).
One drawback might be that the new image gets loaded after assigning a new address to the src property. As the image is not preloaded it takes some time until the new image is retrieved through the Internet. In some situations this is ok - but often these delays are not acceptable. So what can we do about this? Yes, preloading the image is the solution. For this purpose we have to create a new Image-object. Look at these lines of code:
hiddenImg= new Image(); hiddenImg.src= "img3.gif";
The first line creates a new Image-Object. The second line defines the address of the image which shall be represented through the object hiddenImg. We have already seen that assigning a new address to the src attribute forces the browser to load the image the address is pointing at. So the image img2.gif gets loaded when the second line of this code is being executed. As the name hiddenImg implies the image is not being displayed after the browser finished loading it. It is just kept in the memory (or better in the cache) for later use. In order to display this image we can now use this line:
document.myImage.src= hiddenImg.src;
Now the image is being taken from the cache and displayed immediately. We have managed
to preload the image.
Of course the browser must have finished the preloading for being able to display an image
without delay. So if you have many images specified for preloading there might be a delay
nevertheless because the browser has been busy to download all the other pictures. You
always have to consider the speed of the Internet - the downloading of the images doesn't
go faster with this code shown here. We only try to start the downloading of the images
earlier - so the user can see them earlier. This makes the whole process much smoother.
If you have a fast Internet connection you might wonder what all this talk is about. Which
delay is this guy talking about all the time? Well, there are still some people sitting
behind a 14.4 modem (No, not me. I just upgraded to 28.8 - oh yes...).
Changing images on user-initiated events
You can create nice effects through changing images as a reaction to certain events. You can for example change images when the mouse cursor is being moved over a certain area. Just test the following example through moving the cursor across the image (you will get an error message when using a JavaScript 1.0 browser - we will see how to prevent this soon):
The source code for this example looks like this:
<a href="#" onMouseOver="document.myImage2.src='img2.gif'" onMouseOut="document.myImage2.src='img1.gif'"> <img src="img1.gif" name="myImage2" width=160 height=50 border=0></a>
This code causes some problems though:
We will now have a look at a complete script which solves these problems. The script
gets much longer - but once it is written you do not have to bother about it anymore.
There are two requirements for keeping the script flexible:
Here you can see the code at work:
Have a look at the code (I have added some comments):
<html>
<head>
<script language="JavaScript">
<!-- hide
// ******************************************************
// Script from Stefan Koch - Voodoo's Intro to JavaScript
// http://rummelplatz.uni-mannheim.de/~skoch/js/
// JS-book: http://www.dpunkt.de/javascript
// You can use this code if you leave this message
// ******************************************************
// ok, we have a JavaScript browser
var browserOK = false;
var pics;
// -->
</script>
<script language="JavaScript1.1">
<!-- hide
// JavaScript 1.1 browser - oh yes!
browserOK = true;
pics = new Array();
// -->
</script>
<script language="JavaScript">
<!-- hide
var objCount = 0; // number of (changing) images on web-page
function preload(name, first, second) {
// preload images and place them in an array
if (browserOK) {
pics[objCount] = new Array(3);
pics[objCount][0] = new Image();
pics[objCount][0].src = first;
pics[objCount][1] = new Image();
pics[objCount][1].src = second;
pics[objCount][2] = name;
objCount++;
}
}
function on(name){
if (browserOK) {
for (i = 0; i < objCount; i++) {
if (document.images[pics[i][2]] != null)
if (name != pics[i][2]) {
// set back all other pictures
if (pics[i][0].complete)
document.images[pics[i][2]].src = pics[i][0].src;
} else {
// show the second image because cursor moves across this image
if (pics[i][1].complete)
document.images[pics[i][2]].src = pics[i][1].src;
}
}
}
}
function off(){
if (browserOK) {
for (i = 0; i < objCount; i++) {
// set back all pictures
if (document.images[pics[i][2]] != null)
if (pics[i][0].complete)
document.images[pics[i][2]].src = pics[i][0].src;
}
}
}
// preload images - you have to specify which images should be preloaded
// and which Image-object on the wep-page they belong to (this is the first
// argument). Change this part if you want to use different images (of course
// you have to change the body part of the document as well)
preload("link1", "img1f.gif", "img1t.gif");
preload("link2", "img2f.gif", "img2t.gif");
preload("link3", "img3f.gif", "img3t.gif");
// -->
</script>
<head>
<body>
<a href="link1.htm" onMouseOver="on('link1')"
onMouseOut="off()">
<img name="link1" src="link1f.gif"
width="140" height="50" border="0"></a>
<a href="link2.htm" onMouseOver="on('link2')"
onMouseOut="off()">
<img name="link2" src="link2f.gif"
width="140" height="50" border="0"></a>
<a href="link3.htm" onMouseOver="on('link3')"
onMouseOut="off()">
<img name="link3" src="link3f.gif"
width="140" height="50" border="0"></a>
</body>
</html>
This script puts all images in an array pics. The preload() function which is called in the beginning builds up this array. You can see that we call the preload() function like this:
preload("link1", "img1f.gif", "img1t.gif");
This means that the script should load the two images img1f.gif and img1t.gif.
The first image is the image which should be displayed when the mousecursor isn't inside
the image area. When the user moves the mousecursor across the image area the second image
is shown. With the first argument "img1" of the call of the preload()
function we specify which Image-object on the web-page the two preloaded images belong to.
If you look into the <body> part of our example you will find an image with the name
img1. We use the name of the image (and not its number) in order to be able to
change the order of the pictures without changing the script.
The two functions on() and off() are being called through the event-handlers onMouseOver
and onMouseOut. As images cannot react to the events MouseOver and MouseOut we have to put
a link around the images.
As you can see the on() function sets back all other images. This is necessary because it
could happen that several images are highlighted (the event MouseOut does not occur for
example when the user moves the cursor from an image directly outside the window).
Images are certainly a great way for enhancing your web-page. The Image-object lets you create really sophisticated effects. But please notice not every image and JavaScript program enhances your page. If you surf around the net you can see many examples where images are used in a horrible way. It's not the quantity of images that makes your web-page look good - it's the quality. It is really annoying to download 50 kB of bad graphics. Keep this in mind when creating image-effects with JavaScript and your visitors/customers will come back more likely.
©1996,1997 by Stefan Koch
e-mail:skoch@rumms.uni-mannheim.de
http://rummelplatz.uni-mannheim.de/~skoch/
My JavaScript-book