590 likes | 763 Views
JavaScript in Depth. Svetlin Nakov. Telerik Corporation. www.telerik.com. Table of Contents. What we know so far JavaScript syntax JavaScript operators JavaScript Data Types JavaScript Pop-up boxes If and switch, loops functions What is an object?. Table of Contents (2).
E N D
JavaScript in Depth Svetlin Nakov Telerik Corporation www.telerik.com
Table of Contents • What we know so far • JavaScript syntax • JavaScript operators • JavaScript Data Types • JavaScript Pop-up boxes • If and switch, loops • functions • What is an object?
Table of Contents (2) • Built-in JavaScript objects (common) • Boolean • Number • Array • String • Date • RegExp • Function • Object
Table of Contents (3) • Built-in JavaScript objects (uncommon) • Typed arrays • Errors • JSON • Math • Infinity • NaN • undefined
Table of Contents (4) • Enter the DOM • Difference between JS and DOM • DOM objects • Querying the DOM • Traversing the DOM • Manipulation • Events
Table of Contents (5) • Browser differences • Feature detection • Shims, shivs • Polyfills • JavaScript libraries • Closures • Module pattern
What we know so far? Just a recap
Built-in Object a.k.a. language features
Boolean • Boolean • It’s either true or false • There isn’t much to it • Just know that: • Use x = Boolean(false), or x = false instead x = new Boolean(false) if (x) { // this code will execute }
Number • Doesn’t do much either
Array • One of the favourite data structures in JS • Supports instance and literal syntax • Array properties • length – that’s it • Array methods • Mutators: pop, push, reverse, shift, sort, splice, unshift • Accessors: concat, join, slice, indexOf*, lastIndexOf* • Iterators*: filter, forEach, every, map, some, reduce • * = not yet fully supported
Array Mutators var arr = [1,2,3]; arr.pop() // => 3 (last element), arr=[1,2] // Array.push(element) arr.push(4) // => 3 (arr.length), arr=[1,2,4] arr.reverse() // => [4,2,1], arr=[4,2,1] arr.shift() // => 4 (first element), arr=[2,1] // Array.unshift(element) arr.unshift(5) // => 3 (arr.length), arr=[5,2,1] arr.sort() // => [1,2,5], arr=[1,2,5] // Array.splice(index, howMany[, element1[,...[,element2]]]) arr.splice(1,1,6,7,8) // =>[2] (removed), arr=[1,6,7,8,5]
Array Accessors var arr = [1,2,3]; var arr1 = [4,5,6]; arr.concat(arr1) // => [1,2,3,4,5,6], arr=[1,2,3] // arr.join(separator) arr.join(“ | ”) // => “1 | 2 | 3”, arr=[1,2,3] // arr.slice(begin[, end]) arr.slice(0,1) // => [1,2], arr=[1,2,3] arr.indexOf(1) // => 0 arr.indexOf(5) // => -1 arr.push(1) // arr=[1,2,3,1] arr.lastIndexOf(1) // => 3 arr.lastIndexOf(5) // => -1
String • For strings or a sequence of characters (array wise) • Supports instance and literal syntax • Supports array like accessing e.g. string[0] • String properties • length • String methods • charAt, concat, indexOf, lastIndexOf, match, replace, search, slice, split, substr, substring, toUppserCase, toLowerCase, trim*, trimLeft*, trimRight* • Just to name a few
String Methods var str = “Hello, World!”; str.charAt(1) // => “e” str.concat(“!!”) // => “Hello, World!!!” str.indexOf(“o”) // => 4 str.indexOf(“x”) // => -1 str.lastIndexOf(“o”) // => 8 str.lastIndexOf(“x”) // => -1 str.replace(“Hello”, “Goodbye”) // “Goodbye, World!” str.split(“ ”) // => [“Hello,”, “World!”] // str.substr(start[, length]) str.substr(0,4) // => “Hell” // str.substring(indexA[, indexB]) str.substring(0,4) // => “Hell”
Date • Creates Date instances which let you work with dates and times. • Only instance syntax • Few “static” methods • Many instance methods
RegExp • Deals with regular expression • Supports literal and instance syntax • RegExp properties • global • ignoreCase • multiline • lastIndex • RegExp methods • exec • test
Function • The function is an object too • In case you wander: • new Function ([arg1[, arg2[, ... argN]],] functionBody); • new Function("a", "b", "return a + b"); • Function methods (of note) • apply • bind • call • toSource, toString
Function Methods function doStuff(a,b,c) { alert(this); alert(a + b + c); } doStuff(1,2,3) // => [Object Window], 6 // function.call(thisArg[, arg1[, … [,argn]]]) doStuff.call(“Ola”,2,3,4) // => “Ola”, 9 // function.apply(thisArg[, argsArray]) doStuff.apply(“Ola”,[2,3,4]) // => “Ola”, 9
Object • Surprisingly, it had few things • Now it’s getting better • Methods*: • Object creation: • create • Object properties: • hasOwnProperty, definePoperty, defineProperties, keys • Sealing • seal, freeze, isSealed, isFrozen
Document Object Model (DOM) • Every HTML element is accessible via the JavaScript DOM API • Most DOM objects can be manipulated by the programmer • The event model lets a document to react when the user does something on the page • Advantages • Create interactive pages • Updates the objects of a page without reloading it
DOM Nodes • The DOM hierarchy consists of nodes • Each node has a type • Important types: • Node.ELEMENT_NODE == 1 • Node.TEXT_NODE == 3 • Node.COMMENT_NODE == 8 • Node.DOCUMENT_NODE == 9
DOM Nodes Types • Other types: • Node.ATTRIBUTE_NODE== 2 • Node.CDATA_SECTION_NODE== 4 • Node.ENTITY_REFERENCE_NODE== 5 • Node.ENTITY_NODE== 6 • Node.PROCESSING_INSTRUCTION_NODE== 7 • Node.DOCUMENT_TYPE_NODE== 10 • Node.DOCUMENT_FRAGMENT_NODE== 11 • Node.NOTATION_NODE== 12
Querying the DOM • Three general approaches: • Query a specific element • Query a collection of elements • Built in collections • Some methods are applied to document only • Some could be applied to elements
Querying the DOM (2) var header = document.getElementById( “header” ); // => DOMElement or Null if not found var inputs = document.getElementsByName( “choises” ); // => NodeList with 0 or more elements var divs = document.getElementsByTagName( “div” ); // => NodeList with 0 or more elements var popups = document.getElementsByClassName( “popup” ); // => NodeList with 0 or more elements var links = document.links; // => NodeList with 0 or more elements var header1 = document.querySelector( “#header” ); var popups2 = document.querySelectorAll( “.popup” );
Querying the DOM (3) • Some methods are applied to document only • Some could be applied to elements var section = document.getElementById( “section” ); var divs = section.getElementsByTagName( “div” ); var popups = section.getElementsByClassName( “popup” ); var header = section.querySelector( “#header” ); var popups2 = section.querySelectorAll( “.popup” );
Traversing the DOM • You are somewhere in the DOM and you need to get elsewhere • Methods for adjacent nodes • Methods for children collection
Traversing the DOM (2) // Going UP node.parentNode // parent node or null if node is document // Going DOWN node.childNodes // collection of all the child nodes node.fistChild // first node or null if none node.lastChild // last node or null if none // Going LEFT node.previousSibling // preceding node or null if none // Going RIGHT node.nextSibling // succeeding node or null if none
Accessing Elements through the DOM Tree – Example • Warning: may not return what you expected due to Browser differences var el = document.getElementById('div_tag'); alert (el.childNodes[0].value); alert (el.childNodes[1]. getElementsByTagName('span').id); … <div id="div_tag"> <input type="text" value="test text" /> <div> <span id="test">test span</span> </div> </div> • accessing-elements-demo.html
DOM Manipulation • Once we access an element, we can read and write its attributes DOM-manipulation.html function change(state) { var lampImg = document.getElementById("lamp"); lampImg.src = "lamp_" + state + ".png"; var statusDiv = document.getElementById("statusDiv"); statusDiv.innerHTML = "The lamp is " + state"; } … <img src="test_on.gif" onmouseover="change('off')" onmouseout="change('on')" />
Common Element Properties • Most of the properties are derived from the HTML attributes of the tag • E.g. id, name, href, alt, title, src, etc… • style property – allows modifying the CSS styles of the element • Corresponds to the inline style of the element • Not the properties derived from embedded or external CSS rules • Example: style.width, style.marginTop, style.backgroundImage
Common Element Properties (2) • className – the class attribute of the tag • innerHTML – holds all the entire HTML code inside the element • Read-only properties with information for the current element and its state • tagName, offsetWidth, offsetHeight, scrollHeight,scrollTop, nodeType, etc…
DOM Events • JavaScript can register event handlers • Events are fired by the Browser and are sent to the specified JavaScript event handler function • Can be set with HTML attributes (legacy): • Can be accessed through the DOM (legacy): <img src="test.gif" onclick="imageClicked()" /> var img = document.getElementById("myImage"); img.onclick = imageClicked;
DOM Events (2) • Can be accessed through the DOM (standard): • “onclick” vs “click” • Clicking on one element, clicks all the way up the DOM! • False makes element event to fire first var img = document.getElementById("myImage"); img.addEventListiner(“click”, imageClicked, false)
The HTML DOM Event Model (3) • All event handlers receive one parameter • It brings information about the event • Contains the type of the event (mouse click, key press, etc.) • Data about the location where the event has been fired (e.g. mouse coordinates) • Holds a reference to the event sender • E.g. the button that was clicked
The HTML DOM Event Model (4) • Holds information about the state of [Alt], [Ctrl] and [Shift] keys • Some browsers do not send this object, but place it in the document.event • Some of the names of the event’s object properties are browser-specific
Common DOM Events • Mouse events: • onclick, onmousedown, onmouseup • onmouseover, onmouseout, onmousemove • Key events: • onkeypress, onkeydown, onkeyup • Only for input fields • Interface events: • onblur, onfocus • onscroll
Common DOM Events (2) • Form events • onchange – for input fields • onsubmit • Allows you to cancel a form submission • Useful for form validation • Miscellaneous events • onload, onunload • Allowed only for the <body> element • Fires when all content on the page was loaded / unloaded
onload Event – Example • onloadevent <html> <head> <script type="text/javascript"> function greet() {alert("Loaded.");} document.body.addEventListener(“load”, greet, false) </script> </head> <body> </body> </html>
Debugging JavaScript • Modern browsers have JavaScript console where errors in scripts are reported • Errors may differ across browsers • Several tools to debug JavaScript • Microsoft Script Editor • Add-on for Internet Explorer • Supports breakpoints, watches • JavaScript statement debugger; opens the script editor
Firebug • Firebug – Firefox add-on for debugging JavaScript, CSS, HTML • Supports breakpoints, watches, JavaScript console editor • Very useful for CSS and HTML too • You can edit all the document real-time: CSS, HTML, etc • Shows how CSS rules apply to element • Shows Ajax requests and responses • Firebug is written mostly in JavaScript
JavaScript Console Object • The consoleobject exists only if there is a debugging tool that supports it • Used to write log messages at runtime • Methods of the console object: • debug(message) • info(message) • log(message) • warn(message) • error(message)
Browser differences Every browser for itself
Browser differences • The landscape today: • Desktop • 5 major desktop browsers • 4 major desktop rendering engines • Mobile • 4 major mobile browsers • 4 major mobile rendering engines • Platform = browser + OS • Make the math
Feature detection • Feature detection • Shims, shivs • Polyfills • JavaScript libraries • Clojures • Module pattern
Shims, shivs • What is feature detection • Shim – a compatibility workaround • Shiv – a shim that ends with a “v”