应用JavaScript在网站上建立多态图片工具条

在学习JavaScript时,你学到的一个最基本的技巧就是图片交换,即当鼠标指针滑过图片时,图片就会发生改变。这相当简单,只需要应用几个事件处理器和一两行代码即可。在视觉上,如果你只需向用户呈现两种鼠标状态(“正常”与“高亮”)中的一种,这一技巧会非常好用。

当你想要添加第三个按钮状态时,问题就变得复杂起来。例如,考虑一下包含几个按钮的工具条。这时,当鼠标指针滑过它们时,你不仅需要“高亮”按钮,还需要表明哪个按钮当前“被点击”。因此,就需要在JavaScript代码中包含另一个按钮状态(“被点击”状态),以及所引发的新情况。例如,当鼠标指针滑过按钮时,虽然按钮的状态应由“正常”变为“高亮”,但在另一个按钮被点击(或工具打条恢复到默认设置)前,“被点击”(选择)按钮不应改变其状态。

这正是本文希望解决的问题。我们将引导你应用JavaScript与DOM建立一个三种状态的工具条,它能准确而高效地处理不同的按钮状态,以及它们之间的相互依赖性。

 

(1 )为不同的按钮状态建立图片

第一步是创建工具条中的图片。通常,它们是以图像形式提交的菜单项。记住,每个按钮要有三幅图片,分别用于正常、高亮与被点击状态。

在下面的例子中,我们假定一个包含四个按钮的工具条,总共有十二幅图片。为了方便,我们将这些图片命名为:imageXX_n.gif,imageXX_h.gif与imageXX_c.gif。当然,你可以以任何方式给它们命名。

一旦为每种按钮状态建立好图片,将它们保存在网络服务器根目录下的工具目录中,然后进入下一步。

(2 )在HTML 中建立工具条

工具条实质上是一个单行的HTML表,每个单元对应一个按钮。如列表A所示。

列表A

<html>

<head></head>

<body>

?<table id="toolbar">

?<tr>

?<td><img id="1"src="image1_n.gif" width="50" height="50" border="0"></td>

?<td><img id="2"src="image2_n.gif" width="50" height="50" border="0"></td>

?<td><img id="3"src="image3_n.gif" width="50" height="50" border="0"></td>

?<td><img id="4"src="image4_n.gif" width="50" height="50" border="0"></td>

?</tr>

?</table>

</body>

当然,对于如何建立这样的工具条,并没有硬性规定。如果你喜欢,你也可以将它垂直排列,或是使用不同的行列结构。重要的是保留指定给外部<表格>与单个按钮图片的ID。在接下来的步骤中,这些迟早会派上用场。

(3 )添加图片交换代码

接着,我们应用JavaScript来管理各种图片状态。首先,我们建立一个二维数组来保存每个按钮状态的图片文件名(列表B)。

列表B

// define toolbar button images for each state

// (normal, highlight, click)

vartoolbarData = new Array();

toolbarData[1] = new Array('image1_n.gif', 'image1_h.gif', 'image1_c.gif');

toolbarData[2] = new Array('image2_n.gif', 'image2_h.gif', 'image2_c.gif');

toolbarData[3] = new Array('image3_n.gif', 'image3_h.gif', 'image3_c.gif');

toolbarData[4] = new Array('image4_n.gif', 'image4_h.gif', 'image4_c.gif');

你还需要一个总是“知道”当前哪个按钮被选的全程变量。假定在起始阶段,没有工具条按钮被选中,所以开始时,该变量被赋予一个虚假的值。

// store the ID of the currently clicked button

varcurrentSelection = -1;?// -1 = initial dummy value

注:如果你想要你的工具条以一个已经“被点击”的按钮开始,你应该对上面的变量作出修改,以反映那个按钮的ID ,并同时修改在上一步中创建的HTML 表格中的对应初始图片。

图片交换的实际过程通过两个用户定义的函数——highlightItem()selectItem()——来执行。highlightItem()函数负责交换按钮的“正常”与“高亮”状态,如列表C所示。

列表C

// function to change button state on hover

function highlightItem(obj, state) {

?// get button ID

?i = obj.getAttribute('id');

?

?// check if it is currently clicked

?// if not, change state (normal=0, highlight=1)

?if (i != currentSelection) {

?if (state == 1) {

?obj.setAttribute('src', toolbarData[i][1]);

?} else {

?obj.setAttribute('src', toolbarData[i][0]);

?}?

?}

}

当鼠标指针滑过一个工具条按钮时,它向highlightItem()函数发送一个参考值(用它来获取按钮的ID)与一个状态(非1则0,依按钮是“高亮”还是“正常”状态而定)。然后再将按钮的ID与全程变量currentSelection的值进行比较,保证此按钮没有处于“被点击”状态。假定它没有处于“被点击”状态,则按钮的状态发生改变。

SelectItem()函数负责将按钮的状态改变成“正常”或“高亮”或“被点击”。如列表D所示。

列表D

// function to change button state on click

function selectItem(obj) {

?// get button ID

?i = obj.getAttribute('id');

?

?// reset all toolbar buttons to normal

?tbar = document.getElementById('toolbar');

?items = tbar.getElementsByTagName('img');

?for (x = 0; x < items.length; x++) {

?items[x].setAttribute('src', toolbarData[(x+1)][0]);

?}

?

?// set selected button to click state

?obj.setAttribute('src', toolbarData[i][2]);

?

?// publish ID of clicked button

?currentSelection = i;

}

此函数向被点击的按钮提交一个参考值。它首先将所有的工具条按钮恢复为“正常”状态(消除两个按钮被同时点击的可能性),然后改变所选按钮的状态。它还将按钮的ID输出给全程变量currentSelection,以便按钮不会被highlightItem()函数的行为所影响。

(4 )为工具条按钮添加事件处理器

现在只需给各个工具条按钮添加事件处理器了。一般情况下,我们需要onMouseOveronMouseOutonClick事件处理器。例如:

<img id="1" src="image1_n.gif" onMouseOver="highlightItem(this, 1)" onMouseOut="highlightItem(this, 0)" onClick="selectItem(this)" width="50" height="50" border="0">

列表E将所有的代码集合在一个脚本中。

列表E

<html>

<head>

<script language="JavaScript">

// define toolbar button images for each state

// (normal, highlight, click)

vartoolbarData = new Array();

toolbarData[1] = new Array('image1_n.gif', 'image1_h.gif', 'image1_c.gif');

toolbarData[2] = new Array('image2_n.gif', 'image2_h.gif', 'image2_c.gif');

toolbarData[3] = new Array('image3_n.gif', 'image3_h.gif', 'image3_c.gif');

toolbarData[4] = new Array('image4_n.gif', 'image4_h.gif', 'image4_c.gif');

// store the ID of the currently clicked button

varcurrentSelection = -1;?// -1 = initial dummy value

// function to change button state on hover

function highlightItem(obj, state) {

?// get button ID

?i = obj.getAttribute('id');

?

?// check if it is currently clicked

?// if not, change state (normal=0, highlight=1)

?if (i != currentSelection) {

?if (state == 1) {

?obj.setAttribute('src', toolbarData[i][1]);

?} else {

?obj.setAttribute('src', toolbarData[i][0]);

?}?

?}

}

// function to change button state on click

function selectItem(obj) {

?// get button ID

?i = obj.getAttribute('id');

?

?// reset all toolbar buttons to normal

?tbar = document.getElementById('toolbar');

?items = tbar.getElementsByTagName('img');

?for (x = 0; x < items.length; x++) {

?items[x].setAttribute('src', toolbarData[(x+1)][0]);

?}

?

?// set selected button to click state

?obj.setAttribute('src', toolbarData[i][2]);

?

?// publish ID of clicked button

?currentSelection = i;

}

</script>

</head>

<body>

?<table id="toolbar">

?<tr>

?<td><img id="1" src="image1_n.gif" onMouseOver="highlightItem(this, 1)" onMouseOut="highlightItem(this, 0)" onClick="selectItem(this)" width="50" height="50" border="0"></td>

?<td><img id="2" src="image2_n.gif" onMouseOver="highlightItem(this, 1)" onMouseOut="highlightItem(this, 0)" onClick="selectItem(this)" width="50" height="50" border="0"></td>

?<td><img id="3" src="image3_n.gif" onMouseOver="highlightItem(this, 1)" onMouseOut="highlightItem(this, 0)" onClick="selectItem(this)" width="50" height="50" border="0"></td>

?<td><img id="4" src="image4_n.gif" onMouseOver="highlightItem(this, 1)" onMouseOut="highlightItem(this, 0)" onClick="selectItem(this)" width="50" height="50" border="0"></td>

?</tr>

?</table>

</body>

只有注册用户登录后才能发表评论。

posts - 186, comments - 76, trackbacks - 0, articles - 1

Copyright © i have only belief