JavaScript III ECT 270 Robin Burke. Outline Form validation Regular expressions DOM JS document...
-
Upload
howard-marsh -
Category
Documents
-
view
215 -
download
0
Transcript of JavaScript III ECT 270 Robin Burke. Outline Form validation Regular expressions DOM JS document...
JavaScript III
ECT 270
Robin Burke
Outline
Form validationRegular expressions
DOMJS document model reviewW3C DOM
Cross-browser scripting Style
Regular expressions
Form validation so farlegal valuesnot emptyequality
What if I want something more?valid email addressintegerssn
What we need
A way to specify a patternmatch the pattern against the input
Solutionregular expressionsa syntax for expressing textual
patterns
Pattern components
Characters ordinary characters = themselves
Special characters \ | () [ { ^ $ * + ? . to use "escape" with backslash
Example \$
• matches any string containing a dollar sign @
• matches any string contains an "at" sign
Pattern components, cont'd
Character classes \d = any digit \w = any word character, alphanumeric \s = any whitespace character . = any character
Example \w\w\w\d
• matches foo5 but not fo5
Pattern components cont'd
Alternatives[ ] = any of the characters inside
• ranges OK| = any of the expressions joined
Examples[A-Z] matches any uppercase letter[A-Z]|[0-9] matches any uppercase
letter or a digit• same as [A-Z]|\d
Pattern components cont'd
Repetition ? = 0 or 1 occurrences * = 0..n occurrences + = 1..n occurrences {i} = i occurrences {i,j} = between i and j occurrences
Examples (0\.)?\d* matches 0.45 and 45 \d{3}-\d{2}-\d{4} matches 333-33-2222
• SSN pattern \d{3}-?\d{2}-?\d{4} matches even if dashes left out
Javascript implementation
Regular expression is created with / / delimiters re = /\d*/
Match function str.match (/exp/) value.match (/\d*/) usually in an if statement
Can also create a RegExp object re = new RegExp ("\d*") value.match (re)
Actually this doesn't work \ must be protected from JS string handling re = new RegExp ("\\d*")
Example
General pattern tester Validate a form containing a cash
quantity
Problem
(0\.)?\d+ matches 45 045 0.45 .....45 qq55mmm 1q1q1q1q
We might want to ensure the position of the match
More pattern components
Positioning ^ = beginning
• must be the first thing in the pattern $ = end
• must be the end of the pattern Examples
^#.* matches a line whose first character is # ^(0\.)?\d+ matches 0.45 and 45, but not b45 ^(0\.)?\d+$ matches 0.45 and 45, but not b45
or 45b
Validating email
Many possible patterns ^[\\w-_\.]+\@([\\w]\.)+[\\w]+[\\w]$ ^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$ ^[a-zA-Z][\w\.-]*\w@\w[\w\.-]*[\w]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$ /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]
{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
There's more...
Extraction of matched substrings Matching against previous matches in
a string Substitutions etc.
Summary
Regular expressions allow for complex patterns to be written
succinctly allow form validation to depend on data
format Regular expressions
can be dense and difficult to read can be difficult to debug require thorough documentation
JS Document Model
Name-based Collection-based Some parts of the document not so
easy to accessespecially textual document content
Not possible to build an HTML document within JS
Example
Modifying document contentadd menu item
W3C DOM
Document Object Model Based on the DOM for XML
not (very) HTML-specific Much more flexible
can build documents can access any part of the document
Levels 1 – Basic standard 2 – CSS / events
HTML
<html><head><title>DOM Example</title></head><body><h1>DOM Example</h1><div name="pict" style="text-align: center; border-
width: 3 px; border-style: double"><img name="stickers" src="../w7/img/stickerface.gif"
width="230" height="238"> </div><p>Some text and <a href="lec1110.html">a link to the
lecture</a>. End of page.</p></body></html>
Internal representation
HTML
HEAD
TITLE
(text)
BODY
H1
(text)
DIV
IM
A
P
(text) (text)
(text)
Access via JS Document document links [0]
images [0]all
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
pict
stickers
HTML
HEAD
TITLE
(text)
BODY
H1
(text)
DIV
IM
A
P
(text) (text)
(text)
Example
Change the displayed imageuse images collectionuse name
Adding a new image
Problem
This is a mess new collections added for every purpose some collections browser-specific
W3C solution methods for traversal of the tree no special collections ability to generate collections
• based on tag name• based on id
W3C DOM
Basic pieces Node
• general type NodeList
• wherever a collection is needed Element
• HTML element• subtype of Node
Text• a subtype of Node• contains only unmarked-up character data
Accessing DOM contents
document methods getElementsByTagName
• collected by tag (img, a, div, etc.) getElementById
• must be labeled by id, not name node methods
parentNode childNodes firstChild lastChild
element methods getAttribute setAttribute
Example
Changing the displayed imagedocument.getElementsByTagNamedocument.getElementById
Adding a new image
Modifying document content
factory methods of documentcreateElement (tagName)createTextNode
node modifiersappendChild (node)removeChild (node)insertBefore (newNode, currentNode)replaceChild (newNode, oldNode)
Summary
Pluses Available in both NS and IE
• not true of JS document
Conceptually simpler More capable
Minuses Code is wordier Implementation differences in browsers Some browser features still not standardized
Cross-browser headaches
The more advanced features you usethe more likely it is that you'll run into
cross-browser issues biggest problem
handling of the DIV tagnetscape 4.0 added a new concept
"layers"• now wisely abandoned
Standard solution
conditional codingdetermine browser type
• remember window.navigator?
execute appropriate code problem
breaks with new browser versions
Browser-detection example
isNS = false;isIE = false;if (window.navigator.appName.match(/IE/)) isIE=true;
elseif (window.navigator.appName.match(/Netscape|Mozilla/))
isNS = true;if (isNS){ object.moveTo(x, y);} else if (isIE) { object.pixelLeft=x; object.pixelTop=y;}
Better method
Test for specific features that you need
If your code depends on the .all collectiontest for its presence
Problemlots of if statements
Feature-detection example
isNS = false;isIE = false;if (document.all){
isIE=true;) else if (document.layers){
isNS=true;}if (isNS){ object.moveTo(x, y);} else if (isIE) { object.pixelLeft=x; object.pixelTop=y;}
Best solution
Cross-browser API package "application programming interface" a collection of JS functions provide a browser-neutral interface
Example DOMjs.js from book
• a uniform API for style manipulation comprehensive commercial versions exist
Include by using a stand-alone script tag <script language="Javascript"
src="DOMapi.js">
Using an API
Benefitcan forget about browser details
Problemmust learn new API
Good newsnewer Mozilla versions have
eliminated many of the differencesSeparate API less necessary
Next week
Styleespecially positioningspecial effects