Lecture 13   JavaScript Syntax and DOM 
				Reading: 7.1 - 7.4 
				
					Except where otherwise noted, the contents of this presentation are Copyright 2010 Marty Stepp and Jessica Miller.
				
				
			 
			
				7.2 - 7.4: JavaScript Syntax 
				
					
						7.1: Key JavaScript Concepts
					 
					
						7.2, 7.3, 7.4: JavaScript Syntax 
					 
				 
			 
			
				
					Number type
					(7.2.2) 
				 
var enrollment = 99;
var medianGrade = 2.8;
var credits = 5 + 4 + (2 * 3);
 
				
					integers and real numbers are the same type (no int vs. double) 
					
						same operators: + - * / % ++ -- = += -= *= /= %=
					 
					similar precedence  to Java 
					many operators auto-convert types: "2" * 3 is 6 
				 
			 
			
				
					Comments
					(same as Java) 
					(7.2.4) 
				 
 
				
					identical to Java's comment syntax 
					recall: 4 comment syntaxes
						
							HTML:  <!-- comment  --> 
							CSS/JS/PHP:  /* comment  */ 
							Java/JS/PHP:  // comment  
							PHP:  # comment  
						 
					 
				 
			 
			
				More about String 
				
					
						escape sequences behave as in Java:
						\' \" \& \n \t \\
					 
					converting between numbers and Strings:
						
var count = 10;
var s1 = "" + count ;                      
var s2 = count +  " bananas, ah ah ah!";   
var n1 = parseInt ("42 is the answer");    
var n2 = parseFloat("booyah");            
 
					 
					accessing the letters of a String:
						
var firstLetter = s[0] ;          
var firstLetter = s.charAt(0) ;   
var lastLetter = s.charAt(s.length - 1); 
 
					 
				 
			 
			
			
			
			
			
				
					for  loop
					(same as Java) 
					(7.2.8) 
				 
for (initialization ; condition ; update ) {
	statements ;
}
 
var sum = 0;
for (var i = 0; i < 100; i++) { 
	sum = sum + i;
} 
 
var s1 = "hello";
var s2 = "";
for (var i = 0; i < s.length; i++) { 
	s2 += s1.charAt(i) + s1.charAt(i);
} 
 
			 
			
			
				
					Math  object
					(7.2.9) 
				 
var rand1to10 = Math.floor (Math.random()  * 10 + 1);
var three = Math.floor (Math.PI );
 
				
					methods: 
						abs , 
						ceil , 
						cos , 
						floor , 
						log , 
						max , 
						min , 
						pow , 
						random , 
						round , 
						sin , 
						sqrt , 
						tan  
					
					properties:
						E,
						PI
					 
				 
			 
			
				
					Special values: null and undefined
					(7.2.10) 
				 
var ned = null;
var benson = 9;
var caroline;
 
				
					undefined : has not been declared, does not exist 
					null : exists, but was specifically assigned an empty or null value 
					Why does JavaScript have both of these? 
				 
			 
			
				
					Logical operators
					(7.3.1, 7.3.4) 
				 
				
				
					
						> < >= <= && || ! == != === !== 
					 
					
						most logical operators automatically convert types:
						
							
								5 < "7" is true
							 
							
								42 == 42.0 is true
							 
							"5.0" == 5 is true 
						 
					 
					
						=== and !== are strict equality tests; checks both type and value
						 
						 
					
				
			 
			
				
					if/else  statement
					(same as Java) 
					(7.3.2) 
				 
if (condition ) {
	statements ;
} else if (condition ) {
	statements ;
} else {
	statements ;
}
 
				
					identical structure to Java's if/else statement 
					JavaScript allows almost anything as a condition  
				 
			 
			
				
var iLike190M = true;
var ieIsGood = "IE6" > 0;   
if ("web dev is great") {   }
if (0) {   }
 
				
					
						 
						any value can be used as a Boolean
						
							
								"falsey" values: 0, 0.0, NaN, "", null, and undefined 
							 
							"truthy" values: anything else 
						 
					 
					converting a value into a Boolean explicitly:
						
							var boolValue = Boolean( otherValue ) ; 
							var boolValue = !! (otherValue ); 
						 
					 
				 
			 
			
				
					while  loops
					(same as Java) 
					(7.3.5) 
				 
while (condition ) {
	statements ;
}
 
do {
	statements ;
} while (condition );
 
				
					break  and continue keywords also behave as in Java 
				 
			 
			
			
			
			
				
alert("message ");     
confirm("message ");   
prompt("message ");    
 
				
			 
			
				
var name  = [];                          
var name  = [value , value , ..., value ];   
name [index ] = value ;                     
 
var ducks = ["Huey", "Dewey", "Louie"];
var stooges = [];        
stooges[0] = "Larry";    
stooges[1] = "Moe";      
stooges[4] = "Curly";    
stooges[4] = "Shemp";    
 
				
				
					two ways to initialize an array 
					length property (grows as needed when elements are added) 
				 
			 
			
				
var a = ["Stef", "Jason"];   
a.push ("Brian");             
a.unshift ("Kelly");          
a.pop ();                     
a.shift ();                   
a.sort ();                    
 
				
					array serves as many data structures: list, queue, stack, ... 
					methods:
						concat , 
						join , 
						pop , 
						push , 
						reverse , 
						shift , 
						slice , 
						sort , 
						splice , 
						toString , 
						unshift 
						
							push  and pop add / remove from back 
							unshift and sh ift add / remove from front 
							shift and pop return the element that is removed 
						 
					 
				 
			 
			
				
					Splitting strings:
					split  and join 
				 
var s = "the quick brown fox";
var a = s.split (" ");          
a.reverse();                   
s = a.join ("!");               
 
				
					
						split breaks apart a string into an array using a delimiter
						
							
								can also be used with regular expressions  (seen later)
							 
						 
					 
					join merges an array into a single string, placing a delimiter between them 
				 
			 
			
			
			
			
				Problems with JavaScript 
				
					JavaScript is a powerful language, but it has many flaws:
				
				
					the DOM can be clunky to use 
					the same code doesn't always work the same way in every browser
						
							code that works great in Firefox, Safari, ... will fail in IE and vice versa 
						 
					 
					many developers work around these problems with hacks (checking if browser is IE, etc.)
					 
				 
			 
			
				
<script src="http://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js"  
 type="text/javascript"></script>
 
				
					the Prototype  JavaScript library adds many useful features to JavaScript:
						
							many useful  
							added methods to String, Array, Date, Number, Object 
							improves event-driven programming 
							many cross-browser compatibility fixes 
							makes  easier (seen later) 
						 
					 
				 
			 
			
				
					The $  function
					(9.1.3) 
				 
				
$("id ")
 
				
			 
			
				
					DOM element objects
					(7.2.5) 
				 
				
				
				
				
					
						every element on the page has a corresponding DOM object
					 
					
						access/modify the attributes of the DOM object with objectName .attributeName 
					 
				 
			 
			
				
					DOM object properties
					(7.2.5) 
				 
				
<div id="main"  class="foo bar">
	<p>Hello, <em>very</em> happy to see you!</p>
	<img id="icon"  src="images/borat.jpg" alt="Borat" />
</div>
 
				
					
						
							Property
						 
						
							Description
						 
						
							Example
						 
					 
					
					
						
							tagName
						 
						
							element's HTML tag
						 
						
							$("main").tagName is "DIV"
						 
					 
					
						
							className
						 
						
							CSS classes of element
						 
						
							$("main").className is "foo bar"
						 
					 
					
						
							innerHTML
						 
						
							content inside element
						 
						
							$("main").innerHTML is "\n <p>Hello, <em>ve...
						 
					 
					
						
							src
						 
						
							URL target of an image
						 
						
							$("icon").src is "images/borat.jpg"
						 
					 
				
			 
			
			
			
			
				DOM properties for form controls 
				
					
<input id="sid"  type="text" size="7" maxlength="7" />
<input id="frosh"  type="checkbox" checked="checked" /> Freshman?
 
					
				 
				
					
						
							Property
						 
						
							Description
						 
						
							Example
						 
					 
					
					
						
							value
						 
						
							the text in an input control
						 
						
							$("sid").value could be "1234567"
						 
					 
					
					
						
							checked
						 
						
							whether a box is checked
						 
						
							$("frosh").checked is true
						 
					 
					
					
						
							disabled
						 
						
							whether a control is disabled (boolean)
						 
						
							$("frosh").disabled is false
						 
					 
					
					
						
							readOnly
						 
						
							whether a text box is read-only
						 
						
							$("sid").readOnly is false
						 
					 
				
			 
			
			
			
			
			
			
			
			
				Abuse of innerHTML 
				
var paragraph = document.getElementById("welcome");
paragraph.innerHTML = "<p>text and <a href="page.html">link</a>" ;
 
				
					innerHTML can inject arbitrary HTML content into the page 
					however, this is prone to bugs and errors and is considered poor style 
					we forbid using innerHTML to inject HTML tags;  inject plain text only
						
							(later, we'll see a better way to inject content with HTML tags in it) 
						 
					 
				 
			 
			
				
					Adjusting styles with the DOM
					(8.2.2) 
				 
				
					
<button id="clickme">Color Me</button>
 
					
window.onload = function() {
	document.getElementById("clickme").onclick = changeColor;
};
function changeColor() {
	var clickMe = document.getElementById("clickme");
	clickMe.style.color = "red"; 
}
 
					
						Color Me 
					
				 
				
					
						Property 
						Description 
					 
					
					
						
							
						 
						
							lets you set any CSS style property for an element
						 
					 
				
				
				
					contains same properties as in CSS, but with camelCasedNames
						
							examples: backgroundColor, borderLeftWidth, fontFamily 
						 
					 
				 
			 
			
				Common DOM styling errors 
				
					many students forget to write .style when setting styles
var clickMe = document.getElementById("clickme");
clickMe.color = "red";
clickMe.style .color = "red";
 
					 
					style properties are capitalized likeThis, not like-this
clickMe.style.font-size = "14pt";
clickMe.style.fontSize  = "14pt";
 
					 
					style properties must be set as strings, often with units at the end
clickMe.style.width = 200;
clickMe.style.width = "200px" ;
clickMe.style.padding = "0.5em" ;
 
						
						
							write exactly the value you would have written in the CSS, but in quotes