You are on page 1of 43

Javascript, The Movie

Tonight
A little more with arrays Logical Operators and Flow Control Functions Regular Expressions

Arrays can be indexed or associative: 20array.html


var myfisharray = ["goldfish", "betta", "cichlid", "tuna"];
document.write(myfisharray[0] + "<br />"); document.write(myfisharray[3] + "<br />"); var myotherarray = new Array(); myotherarray["sam"] = "Sam lives here"; myotherarray["susie"] = "Susie lives here"; document.write(myotherarray["sam"] + "<br />"); document.write(myotherarray["susie"] + "<br />");

There's really no difference, since the number work as labels, but you can use the distinction.

Using Arrays: A Decent Last Modified


We looked at the date() method with the lastModified property of the document We can use this approach with arrays to make a custom last modified time stamp for web pages If you put this in an external script, you can use the same script to write a custom footer for a web site (as I have)

An Array of Days

Make an array of day names


var days = new Array(8); days[1] = "Sunday"; days[2] = "Monday"; days[3] = "Tuesday"; days[4] = "Wednesday"; days[5] = "Thursday"; days[6] = "Friday"; days[7] = "Saturday";

An object and some variables

Here, we make a date object and pass it's properties into some variables

var dateObj = new Date(document.lastModified); var wday = days[dateObj.getDay() + 1]; var lmonth = months[dateObj.getMonth() + 1]; var date = dateObj.getDate(); var fyear = dateObj.getFullYear();

<!-- Original source for this script from http://javascript.internet.com/page-details/last-modified.html#source Modifications (mainly deletions!) by bil hays var days = new Array(8); days[1] = "Sunday"; days[2] = "Monday"; days[3] = "Tuesday"; days[4] = "Wednesday"; days[5] = "Thursday"; days[6] = "Friday"; days[7] = "Saturday"; var months = new Array(13); months[1] = "January"; months[2] = "February"; months[3] = "March"; months[4] = "April"; months[5] = "May"; months[6] = "June"; months[7] = "July"; months[8] = "August"; months[9] = "September"; months[10] = "October"; months[11] = "November"; months[12] = "December"; var dateObj = new Date(document.lastModified); var wday = days[dateObj.getDay() + 1]; var lmonth = months[dateObj.getMonth() + 1]; var date = dateObj.getDate(); var fyear = dateObj.getFullYear(); document.write('<small>') document.write("Last Modified: " + wday + ", " + lmonth + " " + date + ", " + fyear); document.write('<br />Author: <a href="mailto:SPAM_BLOCKbil_hays@unc.edu">bil hays</a> (remove the SPAM_BLOCK from the address!)'); document.write('</small>');

from general_functions.js

Arrays and External Scripts

One way to use arrays is to make an external javascript with just the data, and a second external javascript with your program to build the page. This means you can have different data for different pages, each controlled by a single program The basic technique is chunking code One Option

Reference the program script as an absolute URL Reference the data array as a relative URL

Example:FAQs
faq_build.js is the script that builds the page faq_data.js holds the data faq.html references both Starting with this and expanding it would be a fine project if you're getting started (what could you add?)

Logical Operators

"and" expressed with && "or" expressed with || "not" expressed with ! Thus:

true && true = true true && false = false true || false = true !true = false

Example
if (var1 == 1 || var2 == 2)

= != == != ===
= assigns values == denotes equivalence (eg. values are the same) === denotes identity (eg. values AND type are the same)

If Statements
Most basic branch Also if/else and if/else if/else Can be nested

if (class == "INLS") { if (section == "668") { document.write("hooray!"); } else {

For loops
Loop is run for x times, where x is defined Brackets for more than one statement Good for where the variable can be used for more than just the loop

for (count=1;count<=50;count=count + 5) { document.write("The count is " + count + "<br>"); document.write("Around the loop again!<br>") }

While loops
While condition is met, loop continues Use brackets to enclose multiple statements Make sure the condition will be met!

count = 1 while (count <=15) { document.write("The count is " + count + "<br>"); count++; }

Incrementing and Decrementing


Use ++ to increment Use -- to decrement count++ is the same as count=count+1

Breaking the loop

Break command: when a condition is met, the loop is broken and control passes out of the loop

<SCRIPT LANGUAGE=JavaScript> count = 1; while( count<= 15) { count++ if (count == 10) break; document.write("The count is " + count + "<br>"); } </SCRIPT>

Breaking the loop

Continue command: when a condition is met, the loop is broken but control passes to the top of the loop

<SCRIPT LANGUAGE=JavaScript> count = 1; while( count<= 15) { count++ if (count == 10) continue; document.write("The count is " + count + "<br>"); } </SCRIPT>

Switch

count = 1; while( count<= 15) { switch(count) { case 5: document.write("We reached 5!<br>"); break; case 10: document.write("Now 10!<br>"); break; case 15: document.write("Finally, 15, Done!<br>"); break; default: document.write("The count is " + count + "<br>"); } count++; }

Other control structures


do while throw, try, catch for in

Functions

Good for an action that will be repeated In a way, building a custom method Functions can accept parameters Variable for functions can be local or global

Local variables are known only within the function Local variables are declared with a "var" statement Variables declared otherwise are global

Global variables are available throughout the document

Functions: An Example
function dateinbar() { var d = new Date(); var y = d.getFullYear(); var m = d.getMonth() + 1; var d = d.getDate(); var t = m + '/' + d + '/' + y + ' '; defaultStatus = "You arrived at the page on " + t + "."; }

<FORM ACTION="" METHOD=POST name="date_in_bar"> <INPUT TYPE=button NAME="date_in_bar_button" VALUE="Put Date in Status Bar" onclick="dateinbar()"> </FORM>

Functions: mouseout_test

A simple function, called by: window.onmouseout = out_text;


function out_text() { if (alert_message[x]) { window.moveTo(0, 0); window.resizeTo(window.screen.availWidth, window.screen.availHeight); alert(x + alert_message[x]); window.focus(); x++; } }

25

Silly Stuff
Browsers can detect a lot of events onblur detects when you leave something behind, see 26_blur_test.html You can also manipulate, to an extent, windows, although security is closing in there, see 27_window_manipulation.html

Functions: Slideshow

Simple event handler in HTML:

<img alt="slide 1" src="data/Slide1.jpg" style="width: 720px; height: 540px;" name="main_slide"><br> <img alt="Navigation Previous" src="nav_previous.gif" style="width: 30px; height: 30px;" onclick="change_slide('prev')"> <img alt="Navigation Next" src="nav_next.gif" style="width: 30px; height: 30px;" onclick="change_slide('next')"><br>

Functions: Slideshow

Simple function in Javascript, this is a very simple manipulation of a DOM object

var x = "1"; function change_slide(y) { if (y == "next"){ x++; } if (y == "prev"){ x--; } document.main_slide.src="data/Slide" + x + ".jpg" } slide_show00.html

More than one way

You could also build an array.

var slides = new Array() var data_dir = './data'; slides[1] = data_dir + '/Slide1.jpg'; // This, for troubleshooting // alert(slides[1]); slides[2] = data_dir + '/Slide2.jpg'; slides[3] = data_dir + '/Slide3.jpg'; slides[4] = data_dir + '/Slide4.jpg'; slides[5] = data_dir + '/Slide5.jpg'; slides[6] = data_dir + '/Slide6.jpg'; slides[7] = data_dir + '/Slide7.jpg'; slides[8] = data_dir + '/Slide8.jpg';

More than one way

and walk that with events

<form action="" method="POST" name="buttons"> <div id="buttons" style="text-align: center;"> <input type="button" name="start" value="Start" onclick="slide_number = 1 ; document.slide.src=slides[1];"> <input type="button" name="previous" value="Previous Slide" onclick="slide_number-- ; document.slide.src=slides[slide_number];"> <input type="button" name="next" value="Next Slide" onclick="slide_number++ ; document.slide.src=slides[slide_number];"> </div> </form>
slide_show01.html

Problems with this slideshow?

Problems with this slideshow?


Forward and Back, and Up? How many slides? Titles? Skip Slides? Only one way to navigate

Additions and Updates

See a var for the total number of slides to control position (this is a hack!), don't fall off the edge Multiple functions for actions And a text box with the path to the slide
function next_slide() { if (slide_number < total_slides) { slide_number++; document.slide.src= slides[slide_number].src; document.text_input_box.text_box1.value = slides[slide_number].src; } } slide_show02.html

Things to Notice
I'm using two arrays, slides and titles in parallel (I could do this with objects) I've established a convention for naming

But I also wanted

Some sort of index of slides with names More flexibility in moving around Aha! Radio buttons, and click on slide So, what I did was

Write some pure html form with radio buttons Got that working Then put in a titles array and Wrote some javascript to output that html with the data from the titles array Put an event handler on the form to move to any of the slides, and one on the img, to move forward one
slide_show03.html

Write_titles()
function write_titles() { var open_a = "a"; document.write('<form action="" name="title_list" \ onchange="goto_slide(document.title_list.value)">'); for (slide_number = 1; slide_number<= total_slides; slide_number++) { if (titles[slide_number] != null) { document.write('<input type="radio" name="radio_button" value="' + slide_number + '" onclick="goto_slide(' + slide_number + ')">' + titles[slide_number] + '<br>'); } else { document.write('<input type="radio" name="radio_button" value="' + slide_number+ '" onclick="goto_slide(' + slide_number + ')">' + "Slide Number " + slide_number + '<br>'); } } document.write('</form>'); }

Then a cleaner Version

slide_show04 is pretty much the same


but the event handler for the radio buttons is moved to the button from the form the radio buttons move with slide selection

Still requires that you put in the number of slides, and build an array of titles.

Regular Expressions

Very arcane Very powerful Allows pattern matching for strings Used in string searches, replacements, comparisons Javascript regex are like perl We'll look at some simple examples tonight What would you use these for?

Methods associated with regex

exec: A RegExp method that executes a search for a match in a string. It returns an array of information. test: A RegExp method that tests for a match in a string. It returns true or false. match: A String method that executes a search for a match in a string. It returns an array of information or null on a mismatch. search: A String method that tests for a match in a string. It returns the index of the match, or -1 if the search fails. replace: A String method that replaces the matched substring with a replacement substring. split: A String method that uses a regular expression or a fixed string to break a string into an array of substrings. from http://www.websina.com/bugzero/kb/regexp.html

Building an Expression
Enclosed in / characters /abc/ represents the string "abc" The expression is an object, created one of two ways

By assignment (note no quotes!) re = /abc/; With the RegExp method re = new RegExp("abc"); Use the latter with user input or where the expression will change

Example of test
function testRegEx(string, expression) { re = new RegExp(expression) if (re.test(string)) { document.write("<p>A match is found!</p>"); } else { document.write("<p>No Match</p>"); } } RegularExpressions.html

Special Characters

^ is used to match the beginning of a string: thus /^The/ matches "The fox" $ matches at the end: thus /fox$/ matches "The fox" Square brackets are used to match any one of the characters listed: thus [aeiou] matches vowels \ is used for escaping special characters

Special Characters
\ is also used for indicating nonprintable ascii \n is a new line \r is a carriage return \t is a tab \s is a single white space

Special Characters
+ matches the preceding char 1 or more times, thus /do+m/ matches "dom" and "doom" * matches the preceding char 0 or more times . matches any single character ? matches the preceding character 0 or 1 time

Example in a form

Regular_Expression_Form03.html

Greedy Expressions

Expressions are "greedy" by default, and try to match the maximum number of times

You might also like