15. JavaScript in depth - Web Front-End

59
JavaScript in Depth Svetlin Nakov Telerik Software Academy academy.telerik.com Manager Technical Training http://nakov.com http://html5course.telerik.com

description

Advanced JavaScript - using JavaScript's built-in objects, accessing and manipulating HTML documents Telerik Software Academy: http://html5course.telerik.com The website and all video materials are in Bulgarian 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? Built-in JavaScript objects (common): Boolean; Number; Array; String; Date; RegExp; Function; Object Built-in JavaScript objects (uncommon): Typed arrays; Errors; JSON; Math; Infinity; NaN; undefined Enter the DOM, Difference between JS and DOM DOM objects Querying the DOM Traversing the DOM Manipulation Events Browser differences Feature detection: Shims, shivs; Polyfills; JavaScript libraries; Closures; Module pattern

Transcript of 15. JavaScript in depth - Web Front-End

Page 1: 15. JavaScript in depth - Web Front-End

JavaScript in Depth

Svetlin Nakov

Telerik Software Academyacademy.telerik.com

Manager Technical Traininghttp://nakov.com

http://html5course.telerik.com

Page 2: 15. JavaScript in depth - Web Front-End

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?2

Page 3: 15. JavaScript in depth - Web Front-End

Table of Contents (2) Built-in JavaScript objects

(common) Boolean

Number

Array

String

Date

RegExp

Function

Object3

Page 4: 15. JavaScript in depth - Web Front-End

Table of Contents (3) Built-in JavaScript objects

(uncommon) Typed arrays

Errors

JSON

Math

Infinity

NaN

undefined4

Page 5: 15. JavaScript in depth - Web Front-End

Table of Contents (4) Enter the DOM

Difference between JS and DOM

DOM objects Querying the DOM Traversing the DOM Manipulation Events

5

Page 6: 15. JavaScript in depth - Web Front-End

Table of Contents (5) Browser differences Feature detection Shims, shivs Polyfills JavaScript libraries Closures Module pattern

6

Page 7: 15. JavaScript in depth - Web Front-End

What we know so far?

Just a recap

Page 8: 15. JavaScript in depth - Web Front-End

Built-in Objecta.k.a. language features

Page 9: 15. JavaScript in depth - Web Front-End

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

9

x = new Boolean(false)if (x) { // this code will execute}

Page 10: 15. JavaScript in depth - Web Front-End

Number Doesn’t do much either

10

Page 11: 15. JavaScript in depth - Web Front-End

Array One of the favorite 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

11

Page 12: 15. JavaScript in depth - Web Front-End

Array Mutators

12

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]

Page 13: 15. JavaScript in depth - Web Front-End

Array Accessors

13

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) // => 0arr.indexOf(5) // => -1

arr.push(1) // arr=[1,2,3,1]arr.lastIndexOf(1) // => 3arr.lastIndexOf(5) // => -1

Page 14: 15. JavaScript in depth - Web Front-End

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

14

Page 15: 15. JavaScript in depth - Web Front-End

String Methods

15

var str = “Hello, World!”;

str.charAt(1) // => “e”str.concat(“!!”) // => “Hello, World!!!”

str.indexOf(“o”) // => 4str.indexOf(“x”) // => -1str.lastIndexOf(“o”) // => 8str.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”

Page 16: 15. JavaScript in depth - Web Front-End

Date Creates Date instances which let you work with dates and times.

Only instance syntax Few “static” methods Many instance methods

16

Page 17: 15. JavaScript in depth - Web Front-End

RegExp Deals with regular expression Supports literal and instance syntax RegExp properties

global

ignoreCase

multiline

lastIndex

RegExp methods exec

test17

Page 18: 15. JavaScript in depth - Web Front-End

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

18

Page 19: 15. JavaScript in depth - Web Front-End

Function Methods

19

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

Page 20: 15. JavaScript in depth - Web Front-End

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

20

Page 21: 15. JavaScript in depth - Web Front-End

Document Object Model

(DOM)

Page 22: 15. JavaScript in depth - Web Front-End

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 22

Page 23: 15. JavaScript in depth - Web Front-End

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

23

Page 24: 15. JavaScript in depth - Web Front-End

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

24

Page 25: 15. JavaScript in depth - Web Front-End

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

25

Page 26: 15. JavaScript in depth - Web Front-End

Querying the DOM (2)

26

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” );

Page 27: 15. JavaScript in depth - Web Front-End

Querying the DOM (3)

27

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” );

Some methods are applied to document only

Some could be applied to elements

Page 28: 15. JavaScript in depth - Web Front-End

Traversing the DOM

28

You are somewhere in the DOM and you need to get elsewhere

Methods for adjacent nodes Methods for children collection

Page 29: 15. JavaScript in depth - Web Front-End

Traversing the DOM (2)

29

// Going UPnode.parentNode // parent node or null if node is document

// Going DOWNnode.childNodes // collection of all the child nodesnode.fistChild // first node or null if nonenode.lastChild // last node or null if none

// Going LEFTnode.previousSibling // preceding node or null if none

// Going RIGHTnode.nextSibling // succeeding node or null if none

Page 30: 15. JavaScript in depth - Web Front-End

Accessing Elements through the DOM Tree –

Example

Warning: may not return what you expected due to Browser differences 30

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

Page 31: 15. JavaScript in depth - Web Front-End

DOM Manipulation Once we access an element, we can read and write its attributes

31

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')" />

DOM-manipulation.html

Page 32: 15. JavaScript in depth - Web Front-End

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

32

Page 33: 15. JavaScript in depth - Web Front-End

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…

33

Page 34: 15. JavaScript in depth - Web Front-End

DOM Events

Page 35: 15. JavaScript in depth - Web Front-End

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):

35

<img src="test.gif" onclick="imageClicked()" />

var img = document.getElementById("myImage");img.onclick = imageClicked;

Page 36: 15. JavaScript in depth - Web Front-End

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

36

var img = document.getElementById("myImage");img.addEventListiner(“click”, imageClicked, false)

Page 37: 15. JavaScript in depth - Web Front-End

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

37

Page 38: 15. JavaScript in depth - Web Front-End

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

38

Page 39: 15. JavaScript in depth - Web Front-End

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 39

Page 40: 15. JavaScript in depth - Web Front-End

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

40

Page 41: 15. JavaScript in depth - Web Front-End

onload Event – Example onload event

41

<html><head> <script type="text/javascript"> function greet() {alert("Loaded.");} document.body.addEventListener(“load”, greet, false) </script></head><body></body></html>

Page 42: 15. JavaScript in depth - Web Front-End

Debugging JavaScript

Page 43: 15. JavaScript in depth - Web Front-End

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

43

Page 44: 15. JavaScript in depth - Web Front-End

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

44

Page 45: 15. JavaScript in depth - Web Front-End

Firebug (2)

45

Page 46: 15. JavaScript in depth - Web Front-End

JavaScript Console Object

The console object 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)

46

Page 47: 15. JavaScript in depth - Web Front-End

Browser differences

Every browser for itself

Page 48: 15. JavaScript in depth - Web Front-End

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

48

Page 49: 15. JavaScript in depth - Web Front-End

Feature detection

Feature detection Shims, shivs Polyfills JavaScript libraries Clojures Module pattern

49

Page 50: 15. JavaScript in depth - Web Front-End

Shims, shivs

What is feature detection Shim – a compatibility

workaround Shiv – a shim that ends with a “v”

50

Page 51: 15. JavaScript in depth - Web Front-End

Polyfills

Polyfill, or polyfiller, is a piece of code (or plugin) that provides the technology that you, the developer, expect the browser to provide natively

Flattening the API landscape if you will

A shim that mimics a future API providing fallback functionality to older browsers

51

Page 52: 15. JavaScript in depth - Web Front-End

Closures

A "closure" is an expression (typically a function) that can have free variables together with an environment that binds those variables (that "closes" the expression)

52

(function() {

// do stuff here // what happens in closure stays in closure // unless exposed

})()

Page 53: 15. JavaScript in depth - Web Front-End

Module pattern

Basically, an implementation of closure

or

53

var Module = (function() { // Do magic stuff here // Don’t forget to return return { … } // some object})()

(function() { // Do magic stuff here // Don’t forget to return window.Module = { … } // some object})()

Page 54: 15. JavaScript in depth - Web Front-End

JavaScript libraries

A JS library may: Abstract common work:

Traversing / manipulating DOM

Ajax related

Animations

Normalize browser differences trough shims

Have syntactic sugar for easier coding

Have a module factory 54

Page 55: 15. JavaScript in depth - Web Front-End

форум програмиране, форум уеб дизайнкурсове и уроци по програмиране, уеб дизайн – безплатно

програмиране за деца – безплатни курсове и уроцибезплатен SEO курс - оптимизация за търсачки

уроци по уеб дизайн, HTML, CSS, JavaScript, Photoshop

уроци по програмиране и уеб дизайн за ученициASP.NET MVC курс – HTML, SQL, C#, .NET, ASP.NET MVC

безплатен курс "Разработка на софтуер в cloud среда"

BG Coder - онлайн състезателна система - online judge

курсове и уроци по програмиране, книги – безплатно от Наков

безплатен курс "Качествен програмен код"

алго академия – състезателно програмиране, състезания

ASP.NET курс - уеб програмиране, бази данни, C#, .NET, ASP.NETкурсове и уроци по програмиране – Телерик академия

курс мобилни приложения с iPhone, Android, WP7, PhoneGap

free C# book, безплатна книга C#, книга Java, книга C#Дончо Минков - сайт за програмиранеНиколай Костов - блог за програмиранеC# курс, програмиране, безплатно

?

? ? ??

?? ?

?

?

?

??

?

?

? ?

Questions?

?

JavaScript in Depth

http://academy.telerik.com

Page 56: 15. JavaScript in depth - Web Front-End

Exercises

1. Create an HTML page that has two text fields (first name and last name) and a button. When the user clicks the button, a message should show the text in the text fields followed by the current time.

2. Create a Web page that asks the user about his name and says goodbye to him when leaving the page.

3. Modify the previous HTML page to have a text field for email address and on clicking the button check if the email is valid (it should follow the format <something>@<host>.<domain>).

4. Create a Web page that shows 20 <div> elements with random location, size and color.

56

Page 57: 15. JavaScript in depth - Web Front-End

Exercises (2)5. Create a drop-down menu

Use table for the main menu blocks

Use hidden <DIV> elements (display: none; position:absolute; top:30px)

Use JavaScript and onmouseover and onmouseout event to change display: none/block

57

Page 58: 15. JavaScript in depth - Web Front-End

Exercises (3)6. Create a DTHML page that has <div>

containing a text that scrolls from right to left automatically

Use setInterval() function to move the text at an interval of 500 ms

Use overflow:hidden for the <div>

Use scrollLeft and scrollWidth properties of the <div> element

58

Page 59: 15. JavaScript in depth - Web Front-End

Free Trainings @ Telerik Academy

"Web Design with HTML 5, CSS 3 and JavaScript" course @ Telerik Academy html5course.telerik.com

Telerik Software Academy academy.telerik.com

Telerik Academy @ Facebook facebook.com/TelerikAcademy

Telerik Software Academy Forums forums.academy.telerik.com