Buttons
Buttons defined by the <input type="button">
tag have been
used to capture events and run scripts. Buttons can also serve as data input methods by associating
values with them. The general format for the <input type="button">
tag is shown below.
<input type="button"
id="id"
value="string" />
Figure 9-28. General format for <input type="button">
tag.
The value
attribute serves two purposes. It provides the label
that appears on the button as well as the value associated with the button. An id
is not required unless the button is referred to in a script.
Using Buttons for Data Entry
When one of the following number buttons is clicked, its value is appended to the
value in the accompanying text box. When the "C" button is clicked, the value in the text box is
cleared. When the "<<" button is clicked, the final character in the field is erased. Use
of buttons in this fashion is the basis for JavaScript calculators.
Figure 9-29. Using buttons for data entry.
<script type="text/javascript">
window.onload = init;
function init()
{
var x = document.getElementsByName("btnNumber");
var btnErase = document.getElementById("btnErase");
var btnClear = document.getElementById("btnClear");
btnClear.onclick = clearNumber;
btnErase.onclick = erase;
for (i = 0; i>x.length; i++)
{
x[i].onclick = append;
}
}
function append()
{
document.getElementById("number").value += this.value;
}
function erase()
{
var length = document.getElementById("number").value.length;
document.getElementById("number").value =
document.getElementById("number").value.substring(0, length-1);
}
function clearNumber()
{
document.getElementById("number").value = "";
}
</script>
<input type="button" value="0" name="btnNumber">
<input type="button" value="1" name="btnNumber">
<input type="button" value="2" name="btnNumber">
<input type="button" value="3" name="btnNumber">
<input type="button" value="4" name="btnNumber">
<input type="button" value="5" name="btnNumber">
<input type="button" value="6" name="btnNumber">
<input type="button" value="7" name="btnNumber">
<input type="button" value="8" name="btnNumber">
<input type="button" value="9" name="btnNumber">
<input type="button" value="." name="btnNumber">
<input type="text" id="number" style="width:100px; text-align:right">
<input type="button" id="btnErase" value="<<">
<input type="button" id="btnClear" value="C">
Listing 9-19. Code to use buttons for data entry.
When a number button is clicked, its onclick
event handler calls the Append()
function to concatenate the passed value to the display area.
Clicking the "C"
button clears the display area. The EraseCharacter()
function removes the last character in the display field by copying all
but the last character back into the field. This replacement substring is extracted from the displayed value with the string method substring(0,Length-1)
: the
string of characters beginning with the first character (0
) and continuing for Length-1
characters.
The <button> Tag
The <button>
tag provides greater versatility in producing buttons. As a container tag, it can enclose any text or HTML code to provide text and/or
graphic displays on the face of the button. The general format for this tag is shown below.
<button id="id">
text and XHTML tags...
</button>
Figure 9-30. General format for <button> tag.
In the following example, three buttons are formatted with images and text. A click on a button opens a secondary window to display a Web page.
Figure 9-31. Using <button> tags as links.
<button style="width:200px; padding:1px; border:outset 3px"
onclick='open("../../html/default.aspx", "", "")'>
<img src="html_tutorial.png" style="width:150px">
<b>HTML&CSS Tutorial</b>
</button>
<button style="width:200px; padding:1px; border:outset 3px"
onclick='open("../default.aspx", "", "")'>
<img src="javascript_tutorial.png" style="width:150px">
<b>JavaScript Tutorial</b>
</button>
Listing 9-20. Code to use <button> tags as links.
Any text, HTML, and/or images can be coded between the opening and closing
<button>
tags. You may need to apply style settings to the button to get enclosed
content positioned properly.
Buttons Events and Handlers
Either of the button types can trap for mouse events surrounding the button. These events
and their handlers are summarized in the following table.
Event Handler |
Event |
onclick |
The mouse is clicked and released with the cursor positioned over the button. |
ondblclick |
The mouse is double-clicked with the cursor positioned over the button. |
onmousedown |
The mouse is pressed down with the cursor positioned over the button. |
onmouseout |
The mouse cursor is moved off the button. |
onmouseover |
The mouse cursor is moved on top of the button. |
onmouseup |
The mouse button is released with the cursor positioned over the button. |
Figure 9-32. Event handlers associated with button events.
The onclick
and ondblclick
handlers are
used to trap mouse clicks on buttons for the purpose of calling functions to carry out processing.
The remaining handlers are most often used to style the button to provide visual clues to actions
surrounding the button. In the following example, a <button>
tag
is styled on mouseover and mouseout events.
Figure 9-33. Styling a button through mouse events.
<button style="width:200px; padding:5px; border:outset 3px"
onclick= "open('../default.aspx', '', '')"
onmouseover="document.getElementById('Text').innerHTML='Link to Tutorial';
document.getElementById('Pic').src='./images/javascript_tutorial.png';
this.style.border='inset 3px'"
onmouseout= "document.getElementById('Text').innerHTML='JavaScript Tutorial';
document.getElementById('Pic').src='./images/javascript_tutorial2.png';
this.style.border='outset 3px'">
<img id="Pic" src="./images/javascript_tutorial2.png" style="width:150px"/><br/>
<span id="Text" style="font-weight:bold">JavaScript Tutorial</span>
</button>
Listing 9-21. Code to style a button through mouse events.
Inline scripts apply style settings on mouseover and mouseout events. In both cases, the text label of the button is changed by assigning a different text string to the
innerText
property of the <span>
tag surrounding the text; the picture is changed through the src
property of the <img>
tag; and the border style of the button is changed between
outset
and inset
styles. Note that the <img>
and <span>
tags require ids
for reference from within the scripts; border style changes use
self-references to the button itself (this
).
A Simple Calculator
Use of buttons to create a simple JavaScript calculator is demonstrated below.
Formula:
Figure 9-34. A simple JavaScript calculator.
The HTML code and button event handlers are shown below. The calculator is formatted inside
a table to control its layout.
<table border="7">
<tr>
<td colspan="4" style="font-family:comic sans ms; text-align:center;
color:white; background-color:gray; font-size:9pt">
JavaScript Calculator
</td>
</tr>
<tr>
<td colspan="3"><input id="Answer" type="text" style="width:100px; text-align:right"></td>
<td><input type="button" style="width:30px" value="=" onclick="EnterEqual()"></td>
</tr>
<tr>
<td><input type="button" style="width:30px" value="1" onclick="EnterNumber(this.value)"></td>
<td><input type="button" style="width:30px" value="2" onclick="EnterNumber(this.value)"></td>
<td><input type="button" style="width:30px" value="3" onclick="EnterNumber(this.value)"></td>
<td><input type="button" style="width:30px" value="+" onclick="EnterOperator(this.value)"></td>
</tr>
<tr>
<td><input type="button" style="width:30px" value="4" onclick="EnterNumber(this.value)"></td>
<td><input type="button" style="width:30px" value="5" onclick="EnterNumber(this.value)"></td>
<td><input type="button" style="width:30px" value="6" onclick="EnterNumber(this.value)"></td>
<td><input type="button" style="width:30px" value="-" onclick="EnterOperator(this.value)"></td>
</tr>
<tr>
<td><input type="button" style="width:30px" value="7" onclick="EnterNumber(this.value)"></td>
<td><input type="button" style="width:30px" value="8" onclick="EnterNumber(this.value)"></td>
<td><input type="button" style="width:30px" value="9" onclick="EnterNumber(this.value)"></td>
<td><input type="button" style="width:30px" value="*" onclick="EnterOperator(this.value)"></td>
</tr>
<tr>
<td><input type="button" style="width:30px" value="C" onclick="EnterClear()"></td>
<td><input type="button" style="width:30px" value="0" onclick="EnterNumber(this.value)"></td>
<td><input type="button" style="width:30px" value="." onclick="EnterNumber(this.value)"></td>
<td><input type="button" style="width:30px" value="/" onclick="EnterOperator(this.value)"></td>
</tr>
</table>
<input id="Formula" type="hidden"/>
Listing 9-22. Code to format and style the calculator.
Notice the final <input id="Formula" type="hidden"/>
field.
The type="hidden"
attribute creates a standard textbox that is hidden
from view. In the example above, this control is given the attribute
type="text"
in order to make it visible so you can see the formulas being created by the
button clicks.
Four functions are called by the buttons. All of the number keys call function EnterNumber()
, passing the number value of the button; the arithmetic operator
keys call function EnterOperator()
, passing the operator symbol; the "=" key calls function EnterEqual()
; and the "C" key calls function EnterClear()
.
<script type="text/javascript">
var op = false;
var eq = false;
function EnterNumber(Number)
{
if (op == false) {
document.getElementById("Formula").value += Number;
document.getElementById("Answer").value += Number; }
else {
document.getElementById("Answer").value = Number;
op = false;
if (eq == true) {
document.getElementById("Formula").value = Number;
eq = false; }
else {
document.getElementById("Formula").value += Number;
}
}
}
function EnterOperator(Operator)
{
if (document.getElementById("Formula").value != "") {
document.getElementById("Answer").value =
eval(document.getElementById("Formula").value);
document.getElementById("Formula").value =
eval(document.getElementById("Formula").value) + Operator;
op = true;
eq = false;
}
}
function EnterEqual()
{
if (document.getElementById("Formula").value != "") {
document.getElementById("Answer").value =
eval(document.getElementById("Formula").value);
document.getElementById("Formula").value =
eval(document.getElementById("Formula").value);
op = true;
eq = true;
}
}
function EnterClear()
{
document.getElementById("Answer").value = "";
document.getElementById("Formula").value = "";
op = false;
eq = false;
}
</script>
Listing 9-23. Script for the calculator.
In general, a call to EnterNumber()
concatenates the passed value to the end of the Answer
textbox string and to the end of the Formula
hidden textbox string.
A call to EnterOperator()
evaluates the Formula
and displays the result in Answer
.
The function also replaces the Formula
with the result and concatenates the operator in preparation for the next entered number.
This pattern of function calls continues for additional numbers and operators entered.
When the "=" button is clicked, function EnterEqual()
is called to produce an Answer
and a new Formula
much like a call to
EnterOperator()
, except that no operator is concatenated to the Formula
since this is the end of the series of calculations.
There is a need to keep track of whether an operator button or equal button was clicked
in order to determine how to handle the next click on a number key. If an operator button was
just clicked, then the next number entered replaces the result showing in the Answer
box; if an operator button was not clicked, then the next number is
concatenated to the number in the box. Likewise, replacement or concatenation takes place in the
Formula
box depending on whether the equal button was just clicked. This
need to keep track of a previous operator or equal button click is handled by the global variables
op
and eq
. These variables are set to true
and false
to indicate the current condition
under which various replacements or concatenations are applied.
Other than this need to track button clicks, the script is fairly straight-forward.
Build a Formula
, evaluate the Formula
and replace the Answer
and Formula
,
then continue building the next Formula
. These operations should be apparent from viewing the visible Formula
textbox.