Lecture 6

Download as pdf or txt
Download as pdf or txt
You are on page 1of 28

CS 3520: Website Development

HTML Forms and JavaScript

Event-driven programs and HTML form elements


▪ event-driven programs
➢ ONLOAD, ONUNLOAD
▪ HTML forms & attributes
➢ button, text box, text area
➢ selection list, radio button, check box, password, hidden, …
▪ JavaScript form events
➢ properties: name, type, value, …
➢ methods: blur(), focus(), click(), …
➢ event handlers: onBlur(), onFocus(), onChange(), onClick(), …
▪ advanced features & techniques
➢ windows & frames, timeouts, cookies
Event-driven programs
in C++, programs are serially executed
▪ start with main function, execute sequentially from first statement
▪ may loop or skip sections of code, but the program proceeds step-by-step

the programmer specifies the sequence in which execution occurs (with some
variability due to input values)

there is a beginning and an end to program execution

computation within a Web page is rarely serial


instead, the page reacts to events such as mouse clicks, buttons, …
▪ much of JavaScript's utility is in specifying actions that are to occur in the page as a
result of some event

the programmer may have little or no control over when code will (if ever) be
executed, e.g., code that reacts to a button click

there is no set sequence, the page waits for events and reacts
OnLoad & OnUnload
<html>
<!-- form01.html -->
the simplest events are
<head>
<title>Hello/Goodbye page</title> when the page is loaded or
<script type="text/javascript">
unloaded
function Hello()
{
globalName=prompt("Welcome to my page. " +
▪ the ONLOAD attribute of the
"What is your name?","");
BODY tag specifies
} JavaScript code that is
automatically executed when
function Goodbye() the page is loaded
{
alert("So long, " + globalName + ▪ the ONUNLOAD attribute
}
" come back real soon."); similarly specifies JavaScript
</script>
code that is automatically
</head> executed when the browser
leaves the page
<body onLoad="Hello();" onUnload="Goodbye();">
Whatever text appears in the page.
</body>
</html>
view page in browser
HTML forms
most event-handling in JavaScript is associated with form elements
an HTML form is a collection of elements for handling input, output, and
events in a page
<form name="FormName">

</form>

form elements include:


for input: button, selection list, radio button, check box, password, …
for input/output: text box, text area, …

we will revisit forms when we consider CGI programming


▪ a form groups together elements, whose contents are submitted as one
Button element
the simplest form element is a button
▪ analogous to a real-world button, can click to trigger events

<input type="button" … />

attributes include: VALUE : specifies label that appears on the button


ONCLICK : specifies code to be executed when clicked

<html>
<!-- form02.html -->

<head>
<title> Fun with Buttons</title>
</head>

<body>
<form name="ButtonForm">
<input type="button" value="Click Me"
onClick="alert('Thanks, I needed that.');" />
</form>
</body>
view page in browser
</html>
Buttons & JavaScript
the ONCLICK event-handler can specify any JavaScript code
▪ can be a sequence of statements inside quotes, can call functions, …

<html>
<!-- form03.html -->

<head>
<title> Fun with Buttons</title>

<script type="text/javascript"
src="http://www.creighton.edu/~davereed/csc551/JavaScript/random.js">
</script>
</head>

<body>
<form name="ButtonForm">
<input type="button" value="Click for Lucky Number"
onClick="num = RandomInt(1, 100);
alert('The lucky number for the day is ' + num);" />
</form>
</body>
</html>

view page in browser


<html>
<!-- form04.html -->
Buttons &
<head>
<title> Fun with Buttons</title> functions
<script type="text/javascript">
function Greeting()
// Results: displays a time-sensitive greeting
{ for complex tasks,
var now = new Date(); should define function(s)
if (now.getHours() < 12) {
alert("Good morning"); and have the ONCLICK
} event trigger a function
else if (now.getHours() < 18) {
alert("Good afternoon"); call
}
else {
alert("Good evening");
}
}
</script>
</head>
<body>
<form name="ButtonForm">
<input type="button" value="Click for Greeting"
onClick="Greeting();" />
</form>
</body>
</html>

view page in browser


Buttons & windows
alert boxes are fine for displaying short, infrequent messages
▪ not well-suited for displaying longer, formatted text
▪ not integrated into the page, requires the user to explicitly close the box

QUESTION: could we instead use document.write ?


NO -- would overwrite the current page, including form elements

but could open a new browser window and write there

var OutputWindow = window.open(); // open window and assign


// a name to that object
// (first arg is an HREF)
OutputWindow.document.open(); // open that window for
// writing
OutputWindow.document.write("WHATEVER"); // write text to that
// window as before
OutputWindow.document.close(); // close the window
<html>
<!-- form05.html --> Window
<head>
<title> Fun with Buttons </title>
example
<script type="text/javascript">
function Help()
// Results: displays a help message in a separate window
{
var OutputWindow = window.open();
OutputWindow.document.open();

OutputWindow.document.write("This might be a context-" +


"sensitive help message, depending on the " +
"application and state of the page.");

OutputWindow.document.close();
}
</script>
</head>

<body>
<form name="ButtonForm">
<input type="button" value="Click for Help"
onClick="Help();" />
</form>
</body>
</html>

view page in browser


<html>
<!-- form06.html --> Window
<head>
<title> Fun with Buttons </title>
example
<script type="text/javascript">
function Help() refined
// Results: displays a help message in a separate window
{
var OutputWindow =
window.open("", "",
"status=0,menubar=0,height=200,width=200");
OutputWindow.document.open();
can have
arguments to
OutputWindow.document.write("This might be a context-" + window.open
"sensitive help message, depending on the " +
"application and state of the page.");
1st arg specifies
OutputWindow.document.close();
} HREF
</script>
</head> 2nd arg specifies
internal name
<body>
<form name="ButtonForm"> 3rd arg specifies
<input type="button" value="Click for Help"
onClick="Help();" /> window
</form> properties (e.g.,
</body>
</html> size)
view page in browser
Text boxes
a text box allows for user input
▪ unlike prompt, user input persists on the page & can be edited
<input type="text" …>

attributes include: NAME : name by which its contents can be referred


SIZE : width of the box (number of characters)
VALUE : initial contents of the box
<html>
<!-- form07.html -->
<head>
<title> Fun with Text Boxes </title>
</head>
<body>
<form name="BoxForm">
Enter your name here:
<input type="text" name="userName" size=12 value="" />
<br /><br />
<input type="button" value="Click Me"
onClick="alert('Thanks, ' + document.BoxForm.userName.value +
', I needed that.');" />
</form>
view page in
</body> browser
</html>
Read/write text boxes
can access text box contents as document.FormName.BoxName.value

similarly, can change the contents with an assignment


Note: the contents are raw text, no HTML formatting
Also: contents are accessed as a string, must parseFloat if want a number

<html>
<!-- form08.html -->

<head>
<title> Fun with Text Boxes </title>
</head>

<body>
<form name="BoxForm">
Enter a number here:
<input type="text" size=12 name="number" value=2 />
<br /><br />
<input type="button" value="Double"
onClick="document.BoxForm.number.value=
parseFloat(document.BoxForm.number.value) * 2;" />
</form> view page
</body>
in browser
</html>
<html>
<!-- form09.html -->
Text box
<head>
events
<title> Fun with Text Boxes </title>
<script type="text/javascript">
function FahrToCelsius(tempInFahr)
// Assumes: tempInFahr is a number (degrees Fahrenheit)
ONCHANGE
// Returns: corresponding temperature in degrees Celsius triggered when
{ the contents of
return (5/9)*(tempInFahr - 32);
} the box are
</script> changed
</head>

<body>
<form name="BoxForm"> ONFOCUS
Temperature in Fahrenheit: triggered when
<input type="text" name="Fahr" size=10 value="0"
onChange="document.BoxForm.Celsius.value =
the mouse
FahrToCelsius(parseFloat(document.BoxForm.Fahr.value));" /> clicks in the
&nbsp; <tt>----></tt> &nbsp; box
<input type="text" name="Celsius" size=10 value=""
onFocus="blur();" />
in Celsius
</form> blur()
</body> removes focus
</html>
view page in browser
Text box validation
what if the user enters a non-number in the Fahrenheit box?

solution: have the text box validate its own contents


▪ start with legal value
▪ at ONCHANGE, verify that new value is legal (otherwise, reset)

▪ the verify.js library defines several functions for validating text boxes

function VerifyNum(textBox, resetValue)


// Assumes: textBox is a text box, resetValue is optional
// Results: alert if textBox does not contain a number, resets if provided
{
var boxValue = parseFloat(textBox.value);
if ( isNaN(boxValue) ) {
alert("You must enter a number value!");
if (resetValue != null) {
textBox.value = resetValue;
}
}
}
<html>
<!-- form10.html --> Validation
example
<head>
<title> Fun with Text Boxes </title>
<script type="text/javascript"
src="http://www.mcs.csuhayward.edu/~bhecker/CS-
3520/Examples/JavaScript/verify.js">
</script>
<script type="text/javascript">
function FahrToCelsius(tempInFahr)
{
return (5/9)*(tempInFahr - 32);
}
</script>
</head>
<body>
<form name="BoxForm">
Temperature in Fahrenheit:
<input type="text" name="Fahr" size=10 value=0
onChange="VerifyNum(this, 0); // this refers to current element
document.BoxForm.Celsius.value =
FahrToCelsius(parseFloat(this.value));" />
&nbsp; <tt>----></tt> &nbsp;
<input type="text" name="Celsius" size=10 value="" onFocus="blur();" />
in Celsius
</form>
</body>
</html>
view page in browser
Text areas
a TEXT box is limited to one line of input/output

a TEXTAREA is similar to a text box in functionality, but can specify any


number of rows and columns

<TEXTAREA NAME="TextAreaName" ROWS=NumRows COLS=NumCols WRAP="virtual">


Initial Text
</TEXTAREA>

▪ Note: unlike a text box, a TEXTAREA has closing tag


initial contents of the TEXTAREA appear between the tags

▪ WRAP="virtual" specifies that text in the box will wrap lines as needed

▪ as with a text box, no HTML formatting of TEXTAREA contents


<html>

Textarea
<!-- form11.html -->
<head>
<title> Fun with Textareas </title>
<script type="text/javascript">
function Table(low, high, power)
example
// Results: displays table of numbers between low & high, raised to power
{
var message = "i: i^" + power + "\n-------\n";
for (var i = low; i <= high; i++) {
message = message + i + ": " + Math.pow(i, power) + "\n";
}
document.AreaForm.Output.value = message;
}
</script>
</head>
<body>
<form name="AreaForm">
<div style="text-align:center">
Show the numbers from
<input type="text" name="lowRange" size=4 value=1 /> to
<input type="text" name="highRange" size=4 value=10 />
raised to the power of <input type="text" name="power" size=3 value=2 />
<br /> <br />
<input type="button" value="Generate Table"
onClick="Table(parseFloat(document.AreaForm.lowRange.value),
parseFloat(document.AreaForm.highRange.value),
parseFloat(document.AreaForm.power.value));" />
<br /> <br />
<textarea name="Output" rows=20 cols=15 wrap="virtual"></textarea>
</div>
</form>
</body> view page in browser
</html>
<html>
<!-- form12.html -->
Textarea example
<head>
<title> Fun with Frames </title>
<script type="text/javascript"
refined
src="http://www.mcs.csuhayward.edu/~bhecker/CS-
3520/Examples/JavaScript/verify.js">
</script>

<script type="text/javascript">
function Table(low, high, power) { /* AS BEFORE */ }
</script>
</head>
<body>
<form name="AreaForm">
<div style="text-align:center">
Show the numbers from
<input type="text" name="lowRange" size=4 value=1
onChange="VerifyInt(this, 1);" /> to
<input type="text" name="highRange" size=4 value=10
onChange="VerifyInt(this, 10);" /> raised to the power of
<input type="text" name="power" size=3 value=2
onChange="VerifyInt(this, 2);" />
<br /> <br />
<input type="button" value="Generate Table"
onClick="Table(parseFloat(document.AreaForm.lowRange.value),
parseFloat(document.AreaForm.highRange.value),
parseFloat(document.AreaForm.power.value));" />
<br /><br />
<textarea name="Output" rows=20 cols=15 wrap="virtual" onFocus="blur();">
</textarea>
</div>
</form>
</body> view page in browser
</html>
More examples
Hoops tournament
▪ text boxes in a table to form brackets
▪ users selects teams by clicking on text boxes, automatically filling in brackets

Letter sequence generator


▪ text boxes to input sequence length, number of sequences, letter choices
▪ button to initiate generation of sequences
▪ text area to display sequences

Substitution cipher
▪ text box to enter substitution key
▪ text areas for message & code, generates code at ONCHANGE event

Prisoner's Dilemma simulation


▪ select boxes for choosing strategies to compete
▪ text boxes for results of each round, scores
▪ buttons to play a single round, complete all rounds, reset

Random walk simulator


▪ text box to display position of walker, number of steps
▪ button to initiate a step
JavaScript & frames
alternatives for program output:
1. alert box : good for small messages
2. separate window : good for longer text, outside of page
3. text box / text area : integrated into page, but awkward & no formatting
4. frames : can easily write lots of output, integrated & fully formattable

<html>
<!-- frame13a.html -->

<head>
<title>Table of Squares</title>
</head> src="about:blank" loads
<frameset rows="20%,*"> a blank page into the frame
<frame name="Input" src="form13.html"> (ready to be written to)
<frame name="Output" src="about:blank">
</frameset>

</html>
Frame example
<html>
<!-- form13.html -->

<head>
<title> Fun with Frames</title>
<script type="text/javascript">
function Help()
// Results: displays a help message in a separate frame
{
parent.Output.document.open();
parent.Output.document.write("This might be a context-" +
"sensitive help message, depending on the " +
"application and state of the page.");
parent.Output.document.close();
}
</script>
</head>

<body>
<form name="ButtonForm">
<input type="button" value="Click for Help" onClick="Help();" />
</form>
</body>
</html>

view page in browser


<html>
<!-- form14.html
<head>
-->
Better
<title>Fun with Frames</title>
<script type="text/javascript"> example
function Table(low, high, power)
{
parent.Output.document.open();
parent.Output.document.write("<table border=1><tr><th>i</th>" +
"<th>i<sup>2</sup></th></tr>");
for (var i = low; i <= high; i++) {
parent.Output.document.write("<tr><td align='right'>" + i + "</td>" +
"<td align='right'>" + Math.pow(i, power) + "</td></tr>");
}
parent.Output.document.write("</table>");
parent.Output.document.close();
}
</script>
</head>
<body>
<form name="ButtonForm">
<div style="text-align:center">
Show the numbers from
<input type="text" name="lowRange" size=4 value=1 /> to
<input type="text" name="highRange" size=4 value=10 />
raised to the power of <input type="text" name="power" size=3 value=2 />
<br /><br />
<input type="button" value="Generate Table"
onClick="Table(parseFloat(document.ButtonForm.lowRange.value),
parseFloat(document.ButtonForm.highRange.value),
parseFloat(document.ButtonForm.power.value));" />
</div>
</form>
</body>
view page in browser
</html>
JavaScript & timeouts
the setTimeout function can be used to execute code at a later time
setTimeout(JavaScriptCodeToBeExecuted, MillisecondsUntilExecution)

Example: forward link to a moved page


<html>
<!-- form15.html -->

<head>
<title> Fun with Timeouts </title>
<script type="text/javascript">
function Move()
// Results: sets the current page contents to be newhome.html
{
self.location.href = "newhome.html";
}
</script>
</head>

<body onLoad="setTimeout('Move()', 3000);">


This page has moved to <a href="newhome.html">newhome.html</a>.
</body> view page in
</html> browser
Another timeout example
<html>
<!-- form16.html -->

<head>
<title> Fun with Timeouts </title>
<script type="text/javascript">
function timeSince()
// Assumes: document.CountForm.countdown exists in the page
// Results: every second, recursively writes current countdown in the box
{
// CODE FOR DETERMINING NUMBER OF DAYS, HOURS, MINUTES, AND SECONDS
// UNTIL GRADUATION

document.CountForm.countdown.value=
days + " days, " + hours + " hours, " +
minutes + " minutes, and " + secs + " seconds";

setTimeout("timeSince();", 1000);
}
</script>

</head>

<body onLoad="timeSince();">
<form name="CountForm">
<div style="text-align:center">
Countdown to Graduation 2003 <br>
<input type="text" name="countdown" size=50 value="" onFocus="blur();" />
</div>
</form>
</body>
</html> view page in browser
Cookies & JavaScript

recall that cookies are data files stored on the client machine
▪ can be accessed and/or modified by the server
▪ can also be accessed and/or modified directly by JavaScript code in a page

potential applications:
▪ e-commerce: remember customer name, past visits/purchases, password, …
▪ tutorials: remember past experience, performance on quizzes, …
▪ games: remember high score, best times, …

each Web page can have its own cookie


▪ document.cookie is a string of attribute=value pairs, separated by ;

"userName=bhecker;score=100;expires=Mon, 21-Feb-01 00:00:01 GMT"


function getCookie(Attribute)
// Assumes: Attribute is a string
// Results: gets the value stored under the Attribute
{
cookie.js
if (document.cookie.indexOf(Attribute+"=") == -1) {
return "";
}
else {
var begin = document.cookie.indexOf(Attribute+"=") + Attribute.length+1;
var end = document.cookie.indexOf(";", begin);
if (end == -1) end = document.cookie.length;
return unescape(document.cookie.substring(begin, end));
}
}

function setCookie(Attribute, Value)


// Assumes: Attribute is a string
// Results: stores Value under the name Attribute, expires in 30 days
{
var ExpireDate = new Date();
ExpireDate.setTime(ExpireDate.getTime() + (30*24*3600*1000));
document.cookie = Attribute + "=" + escape(Value) +
"; expires=" + ExpireDate.toGMTString();
}

function delCookie(Attribute)
// Assumes: Attribute is a string
// Results: removes the cookie value under the name Attribute
{
var now = new Date();
document.cookie = Attribute + "=; expires=" + now.toGMTString();
}
<html>
<!-- form17.html
<head>
-->
Cookie
<title> Fun with Cookies </title>
<script type="text/javascript" example
src="http://www.mcs.csuhayward.edu/~bhecker/CS-
3520/Examples/JavaScript/cookie.js">
</script>
<script type="text/javascript">
function Greeting()
// Results: displays greeting using cookie
{
visitCount = getCookie("visits");
if (visitCount == "") {
alert("Welcome to my page, newbie.");
setCookie("visits", 1);
}
else {
visitCount = parseFloat(visitCount)+1;
alert("Welcome back for visit #" + visitCount);
setCookie("visits", visitCount);
}
}
</script>
</head>
<body onLoad="Greeting();">
Here is the stuff in my page.
<form name="ClearForm" align="center">
<div style="text-align:center">
<input type="button" value="Clear Cookie" onClick="delCookie('visits');" />
</div>
</form>
</body>
</html>

view page in browser


End of Lecture

You might also like