spacer

Webref WebRef   Sitemap · Experts · Tools · Services · Newsletters · About i.com

home / experts / javascript / column19


Consecutive Animations

Developer News
Microsoft Shows Off Silverlight 4, IE9 Plans
Metasploit Expands Vulnerability Test Framework
HyperCard Reborn?

Here's the HTML code that defines our animated elements:

<DIV ID="ball1" STYLE="position: absolute; left: 200; -->
top: 200; width: 50;"><IMG SRC="ball1.gif" WIDTH="50" -->
HEIGHT="50"></DIV>
<DIV ID="ball2" STYLE="position: absolute; left: 350; -->
top: 480; width: 25;"><IMG SRC="ball2.gif" WIDTH="25" -->
HEIGHT="25"></DIV>

We embed the following script at the end of the document:

<SCRIPT LANGUAGE="JavaScript1.2">
<!--

document.write("<SCRIPT SRC='animate.js'></SCRIPT>");
onload = start;

function start() {
  anim1 = new animation("ball1");
  if (!anim1.element) return;
  anim2 = new animation("ball2");

  anim2.slideBy(200, -300, 10, 50, "anim1.circle(100, 0, -60, -->
0, 3, 50)");
}

// -->
</SCRIPT>

As you can see, it isn't easy to create consecutive animations, because each following animation must be handed to its previous one as a string. As a result, we must define strings within strings. Let's change the nature of the statement argument. Instead of specifying a statement to be executed at the end of the animation, we'll hand the method an array of statements. Here's an example:

function start() {
  anim1 = new animation("ball1");
  if (!anim1.element) return;
  anim2 = new animation("ball2");

  myArray = new Array();
  myArray[0] = "anim1.circle(100, 0, -60, 0, 3, 50, 'myArray')";
  myArray[1] = "anim2.circle(100, 30, 30, 2, 5, 25, 'myArray')";

  anim2.slideBy(200, -300, 10, 50, "myArray");
}

The array must be defined without the var keyword, because it should be global. By handing the name of the array (as a string) to the animation functions, they can execute the upcoming statement in the array when the current animation ends. You may recall the following statement in our methods:

if (this.statement) eval(this.statement);

This statement executes when the current animation comes to an end. Instead of evaluating the statement parameter, we need to shift off and evaluate its first statement:

if (this.statement) {
  var ar = eval(this.statement);
  if (ar.length > 0)
    eval(ar.shift());
}

The first statement in this block assigns a reference of the global array to a local variable named ar. Since ar simply references the array of animation commands, any change we make to ar also reflect the actual global array. If the array still has one or more elements (animation commands), we shift off its first element and evaluate it. The built-in shift() method was introduced in Navigator 4.0x. It removes the first element from an array and returns that element. Therefore, it changes the length of the array. However, the shift() method isn't supported by Internet Explorer 4.0x. We'll write our own version of the function:

function shift(ar) {
  var first = ar[0];
  for (var i = 1; i < ar.length; i++) {
    ar[i - 1] = ar[i];
  }
  ar.length--;
  return first;
}

Here's the corresponding cross-browser conditional block:

if (this.statement) {
  var ar = eval(this.statement);
  if (ar.length > 0)
    eval(shift(ar));
}

http://www.internet.com

internet.commediabistro.comJusttechjobs.comGraphics.com

Search:

WebMediaBrands Corporate Info

Legal Notices, Licensing, Permissions, Privacy Policy.
Advertise | Newsletters | Shopping | E-mail Offers | Freelance Jobs

webref The latest from WebReference.com Browse >
Rolling Out Your Own HTML Application Version Control · HTML 5: Client-side Storage · Working with Ajax Server Extensions
Sitemap · Experts · Tools · Services · Email a Colleague · Contact FREE Newsletters 
 The latest from internet.com
Wi-Fi Product Watch, November 2009 · Chip Market Recovering From '08 Collapse · Low-Cost Tools to Kickstart Your New Business


Created: May 21, 1998
Revised: May 21, 1998

URL: http://www.webreference.com/js/column19/consecutive.html