spacer

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

home / experts / javascript / column23


Behavior Handler's UniqueID

Developer News
OpenOffice 3.2 Lands Amid Critical Changes
Red Hat, IBM Firmly in KVM Virtualization Camp
Red Hat Talks Up Open Source Cloud Plans

Behavior Handlers provide a mechanism for setting and retrieving an element ID. The general syntax is as follows:

myID = object.uniqueID

where object can be any of the page objects, such as the document object, the current element that the behavior applies to (BehaviorID.element), or omitted altogether. In the latter case, the default behavior's ID is used.

When you apply the uniqueID property to an element, a new ID is generated and is assigned to that particular element. Every access to that particular element's property will return the same ID.

The algorithm we use in our Connect Three game is based on these characteristics. This is the right place to explain how our game works. When we load the game board in the scriptlet's onload() function, we assign a unique ID to each of the nine boxes and we save it in the loadEvent event object:

function onload() {
  loadEvent = createEventObject();
  loadEvent.id = uniqueID;
  fireEvent("onBoxLoad",loadEvent);
}

We then fire the onBoxLoad event and pass the loadEvent event object to the hosting page. Back at the containing page, we create a new object for each box and save it in a 3x3 array, according to the box coordinates on the game board:

function handleBoxLoad(i,j) {
  grid[i][j] = new createBoxObject(window.event);
}

We then copy each box' unique ID to the new object:

function createBoxObject(event) {
  this.id = event.id;
  this.playedBy = "";
}

When all nine boxes are in place, we have a 3x3 array, each element of the array is an object which holds its unique ID.

When a box is clicked, we pick its unique ID in the scriptlet's onclick() function:

function onclick() {
  if (src.indexOf("ibutton.bmp") < 0) return;  
  clickEvent = createEventObject();
  clickEvent.id = uniqueID;
  if (window.lastPlayedBy == "o") {
    src = "xbutton.bmp";
    window.lastPlayedBy = "x";
    clickEvent.playedBy = "x";
  }
  else {  // lastPlayedBy = "x"
    src = "obutton.bmp";
    window.lastPlayedBy = "o";
    clickEvent.playedBy = "o";
  }
  fireEvent("onBoxClick", clickEvent);
}

Player A uses "x" game pieces and is called the x-player. The other player uses "o" game pieces and is called the o-player. First we check if a valid box has been clicked, i.e. a box that was not clicked until now. We detect it by checking that the src property of the image is not the original blank one, ibutton.bmp. After passing this test, we create a new object (clickEvent) and store the element's unique ID there. The rest of the function just picks the correct GIF to change the box' src property to. If the previous player was the x-player, the current one is the o-player and we change the image accordingly. Vice versa if the previous player was the o-player. We store the player identity in the playedBy property of the new clickEvent object. Finally we fire the onBoxClick event and pass the clickEvent object to the containing page.

Back at the hosting page, we first find the coordinates of the clicked box. We do it by checking the clicked box' ID against all nine unique ID, previously saved at loading time:

function handleBoxClick() {
  for (var i = 1; i <= 3; i++)
    for (var j = 1; j <=3; j++)
      if (grid[i][j].id == window.event.id) {
        iIndex = i;
        jIndex = j;
        var lastPlayedBy = window.event.playedBy;
      }
 
  grid[iIndex][jIndex].playedBy = window.event.playedBy;
  if (rowComplete()) {
    alert("The " + lastPlayedBy + " wins");
    window.location.reload();
  }
}

Once we find the clicked box, we also keep the player identity in a local variable, lastPlayedBy, and update the relevant object in the 3x3 array, grid. What's left is to check for a connect-three edge, horizontally, vertically, or diagonally:

function rowComplete() {
  var lastPlayedBy = grid[1][1].playedBy;
  if ((lastPlayedBy != "") &&
      (grid[2][1].playedBy == lastPlayedBy) &&
      (grid[3][1].playedBy == lastPlayedBy)) return(true);
  lastPlayedBy = grid[1][2].playedBy;
  if ((lastPlayedBy != "") && 
      (grid[2][2].playedBy == lastPlayedBy) &&
      (grid[3][2].playedBy == lastPlayedBy)) return(true);
  lastPlayedBy = grid[1][3].playedBy;
  if ((lastPlayedBy != "") && 
      (grid[2][3].playedBy == lastPlayedBy) &&
      (grid[3][3].playedBy == lastPlayedBy)) return(true);
  lastPlayedBy = grid[1][1].playedBy;
  if ((lastPlayedBy != "") && 
      (grid[1][2].playedBy == lastPlayedBy) &&
      (grid[1][3].playedBy == lastPlayedBy)) return(true);
  lastPlayedBy = grid[2][1].playedBy;
  if ((lastPlayedBy != "") && 
      (grid[2][2].playedBy == lastPlayedBy) &&
      (grid[2][3].playedBy == lastPlayedBy)) return(true);
  lastPlayedBy = grid[3][1].playedBy;
  if ((lastPlayedBy != "") && 
      (grid[3][2].playedBy == lastPlayedBy) &&
      (grid[3][3].playedBy == lastPlayedBy)) return(true);
  lastPlayedBy = grid[1][1].playedBy;
  if ((lastPlayedBy != "") && 
      (grid[2][2].playedBy == lastPlayedBy) &&
      (grid[3][3].playedBy == lastPlayedBy)) return(true);
  lastPlayedBy = grid[1][3].playedBy;
  if ((lastPlayedBy != "") && 
      (grid[2][2].playedBy == lastPlayedBy) &&
      (grid[3][1].playedBy == lastPlayedBy)) return(true);
}

The function returns true when three boxes in a row were clicked by the same player (8 possibilites to check for).

When the uniqueID property is applied the the docuement object, a new ID is generated and can subsequently be assigned to an element.

http://www.internet.com


The Network for Technology Professionals

Search:

About Internet.com

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

webref The latest from WebReference.com Browse >
Search Engine Optimization: Selecting and Embedding Keywords · Are Google's Language Translation Web Services Ready for Prime Time? · Installing and Using Meeplace, the Business Review CMS
Sitemap · Experts · Tools · Services · Email a Colleague · Contact FREE Newsletters 
 The latest from internet.com
IBM DB2 10 for z/OS: Justifying the Upgrade · Living La Vida Colo: Choosing the Right Colocation Facility · FTC Concerns over Social Media Privacy Linger


Created: August 11, 1998
Revised: August 11, 1998

URL: http://www.webreference.com/js/column23/uniqueid.html