85
JavaScript Needn’t Hurt! Thomas Kjeldahl Nilsson [email protected] linkedin.com/in/thomaskjeldahlnilsson twitter.com/thomanil

JavaScript Neednt Hurt - JavaBin talk

Embed Size (px)

Citation preview

Page 1: JavaScript Neednt Hurt - JavaBin talk

JavaScript Needn’t Hurt!

Thomas Kjeldahl [email protected]

linkedin.com/in/thomaskjeldahlnilssontwitter.com/thomanil

Page 2: JavaScript Neednt Hurt - JavaBin talk
Page 3: JavaScript Neednt Hurt - JavaBin talk
Page 4: JavaScript Neednt Hurt - JavaBin talk

What Are We Covering Today?

Language basicsHtml scripting

Good practicesTools

10,000 ft view!

Page 5: JavaScript Neednt Hurt - JavaBin talk

History Lesson

Page 6: JavaScript Neednt Hurt - JavaBin talk
Page 7: JavaScript Neednt Hurt - JavaBin talk

Brendan Eich

Page 8: JavaScript Neednt Hurt - JavaBin talk

2 WEEKS

Page 11: JavaScript Neednt Hurt - JavaBin talk

What Sucks?Rushed out the door

Some bad language featuresCrossbrowser problems

Page 12: JavaScript Neednt Hurt - JavaBin talk

What Rocks?Powerful, elegant, dynamic

Present & enabled for most usersNot confined to the browser

Small learning surface

Page 13: JavaScript Neednt Hurt - JavaBin talk

Language Basics

SyntaxTypes

VariablesObjects

Functions

Page 14: JavaScript Neednt Hurt - JavaBin talk

Basic SyntaxSimilar to Java, C#

Operators, statementsif-else, while, for, try-catch-finally

Still in Kansas...

Page 15: JavaScript Neednt Hurt - JavaBin talk

TypesStrings

NumbersBooleans

ObjectsArrays

Page 16: JavaScript Neednt Hurt - JavaBin talk

Variable Declarations

var x = “foo”; // stringvar x = 2; // numbervar x = true; // booleanvar x = { }; // objectvar x = [ ]; // array

Page 17: JavaScript Neednt Hurt - JavaBin talk

Objects

Page 18: JavaScript Neednt Hurt - JavaBin talk

Object CreationLiteral Form

var basicProject = { name : "Steria Workshop", version : 1.2,

getName : function() { return this.name; } };

Page 19: JavaScript Neednt Hurt - JavaBin talk

Object CreationDynamic Form

var basicProject = {};

basicProject.name = "Steria Workshop";basicProject.version = 1.2;

basicProject.getName = function() { return this.name;};

Page 20: JavaScript Neednt Hurt - JavaBin talk

Objects as Maps(Associative Arrays)

var person = { firstname:"John", lastname:"Smith" };

person.firstname; // => "John" (Access using identifier)person["firstname"]; // => "John" (Access using variable name)

Page 21: JavaScript Neednt Hurt - JavaBin talk

Arrays and ObjectsCan Be Deeply Nested

var outerObject = { innerArray : [ innerObject : { deepestArray : [1,2,3] } ]};

Page 22: JavaScript Neednt Hurt - JavaBin talk

JSON

{"firstName":"Gustav","lastName":"Adolf","roles":["King of Sweden","Terrible shipbuilder"],"other":{"birth":"9.12.1594","death":"16.11.1632"}}

Page 23: JavaScript Neednt Hurt - JavaBin talk

Kind Familiar Looking

{ "firstName" : "Gustav", "lastName" : "Adolf", "roles" : [ "King of Sweden", "Terrible shipbuilder" ], "other" : { "birth" : "9.12.1594", "death" : "16.11.1632" }}

Page 24: JavaScript Neednt Hurt - JavaBin talk

JavaScriptObject Literal!

var evaluatedObject = { firstName : "Gustav", lastName : "Adolf", roles : [ "King of Sweden", "Terrible shipbuilder" ], other : { birth : "9.12.1594", death : "16.11.1632" }};

Page 25: JavaScript Neednt Hurt - JavaBin talk

Inheritance

Page 26: JavaScript Neednt Hurt - JavaBin talk

What is OOP?

Page 27: JavaScript Neednt Hurt - JavaBin talk

Prototypal Inheritance (Simplified)

var employee = {name : "CEO Jack", company : "ACME Inc."};var janitor = Object.create(employee);

// Janitor now looks and behaves just like its prototype, Employeejanitor.company // => "ACME Inc.", chains back to prototype.company

janitor.name = "Janitor Tim"; // Shadow namejanitor.tools = ["broom", "bucket"]; // Define member variable only on child

employee.name = "CEO Jane"; // Change name of prototypejanitor.name; // => Still "Janitor Tim". Shadowed members unaffected by prototype

changes

Page 28: JavaScript Neednt Hurt - JavaBin talk

Flexibility!

Page 29: JavaScript Neednt Hurt - JavaBin talk

Functions

Page 30: JavaScript Neednt Hurt - JavaBin talk

Simple Function Definition

function add(a, b) { return a + b;}

Page 31: JavaScript Neednt Hurt - JavaBin talk

Roughly Same Result:

var add = function(a, b) { return a + b;};

// Use this consistently// Helps you remember:// Functions are just variables!

Page 32: JavaScript Neednt Hurt - JavaBin talk

An AnonymousFunction...

function(element) { // Do something with element}

Page 33: JavaScript Neednt Hurt - JavaBin talk

...Can Be SentTo Another Function

each(collection, function(element) { // Do something with current element});

Page 34: JavaScript Neednt Hurt - JavaBin talk

Example:Event Handler

button.onClick(function(element) { alert(«You clicked me!»);});

Page 35: JavaScript Neednt Hurt - JavaBin talk
Page 36: JavaScript Neednt Hurt - JavaBin talk
Page 37: JavaScript Neednt Hurt - JavaBin talk

Sharp EdgesGlobal variablesNo block scope

Semicolon insertion== operator

Page 38: JavaScript Neednt Hurt - JavaBin talk

Properly ScopedVariable

var getSmallNumber = function(){ var smallNumber = 42; // Note use of var keyword return smallNumber;};

Page 39: JavaScript Neednt Hurt - JavaBin talk

Sloppy,Global Variable

var getSmallNumber = function(){ smallNumber = 42; return smallNumber;};

// Missing var prefix = smallNumber gets global scope// Becomes available for all code// Sticks around and pollutes namespace

Page 40: JavaScript Neednt Hurt - JavaBin talk

No Block Scope

var x = 1;

if (true) { var x = 123;

} // x => 123

Page 41: JavaScript Neednt Hurt - JavaBin talk

Semicolon insertion

Don't force the browser to guess!

Page 42: JavaScript Neednt Hurt - JavaBin talk

Example

a = b + c(d + e).print()

becomes...

a = b + c(d + e).print();

Page 43: JavaScript Neednt Hurt - JavaBin talk

== vs ===

Page 44: JavaScript Neednt Hurt - JavaBin talk

Quiz

'' == '0' // true or false?0 == '' // true or false?0 == '0' // true or false?false == 'false' // true or false?false == '0' // true or false?false == undefined // true or false?false == null // true or false?null == undefined // true or false?' \t\r\n ' == 0 // true or false?

Page 45: JavaScript Neednt Hurt - JavaBin talk

How ManyDid You Get?

'' == '0' // false0 == '' // true0 == '0' // truefalse == 'false' // falsefalse == '0' // truefalse == undefined // falsefalse == null // falsenull == undefined // true' \t\r\n ' == 0 // true

// Why? Type coercion on right operand!

Page 46: JavaScript Neednt Hurt - JavaBin talk

Instead, Use ===(And !==)

'' === '0' // false0 === '' // false0 === '0' // falsefalse === 'false' // falsefalse === '0' // falsefalse === undefined // falsefalse === null // falsenull === undefined // false' \t\r\n ' === 0 // false

Page 47: JavaScript Neednt Hurt - JavaBin talk

ClientsideDOM scripting

jQueryFirebug

Page 48: JavaScript Neednt Hurt - JavaBin talk

The DOM

Page 49: JavaScript Neednt Hurt - JavaBin talk
Page 50: JavaScript Neednt Hurt - JavaBin talk

<TABLE> <TBODY> <TR> <TD>Shady Grove</TD> <TD>Aeolian</TD> </TR> <TR> <TD>Over the River, Charlie</TD> <TD>Dorian</TD> </TR> </TBODY> </TABLE>

Page 51: JavaScript Neednt Hurt - JavaBin talk
Page 52: JavaScript Neednt Hurt - JavaBin talk

DOM ScriptingBasics

x.getElementById(id) ; // get the element with a specified id

x.getElementsByTagName(name); // get all elements with a // specified tag name

x.appendChild(node); // insert a child node to xx.removeChild(node), // remove a child node from x

x.innerHTML = «<p>New text</p>»; // fill element with html or text

Page 53: JavaScript Neednt Hurt - JavaBin talk

DOM Api:Crossbrowser Headache

http://www.quirksmode.org

Page 54: JavaScript Neednt Hurt - JavaBin talk

Use Frameworks

Page 55: JavaScript Neednt Hurt - JavaBin talk

jQuery

Page 56: JavaScript Neednt Hurt - JavaBin talk

Instant Win:CrossbrowserNon-verbose

Traverse DOMManipulate DOM

Page 57: JavaScript Neednt Hurt - JavaBin talk

Lots of Other Stuff, TooServer communicationUI widgets and effects

each(), map(), etcJSON parsing

+++

Page 58: JavaScript Neednt Hurt - JavaBin talk

jQuery Function

$() // Short formjQuery() // Long form

Page 59: JavaScript Neednt Hurt - JavaBin talk

Find Stuff

$(“p”); // Find all paragraphs$(“#shoppingList”); // Find element with id 'shoppingList'$(“.shoppingListItem”); // Find elements with class 'shoppingListItem'$(“:text”); // Find all text elements$(“:visible”); // Find only visible elements

Page 60: JavaScript Neednt Hurt - JavaBin talk

$() Wraps and Returns Matching Element(s)

Page 61: JavaScript Neednt Hurt - JavaBin talk

Manipulate MatchedDOM Elements

$(“p”).css(”color”, ”green”); // Set color on all paragraph elements$(“p”).hide(); // Hide all paragraphs

// Make all input buttons react to mouse clicks$(“input”).click(function(){ alert(”You clicked this button!”); });

Page 62: JavaScript Neednt Hurt - JavaBin talk

ChainingEvery API call returns jQuery object

So we can chain function calls together“Fluent API”

Page 63: JavaScript Neednt Hurt - JavaBin talk

Chaining Example

// Set color on all paragraph elements, then hide them all$(“p”).css(”color”, ”green”).hide();

Page 64: JavaScript Neednt Hurt - JavaBin talk

Caution!Use frameworks as neededBut don't depend on them!

JavaScript != jQuery

Page 65: JavaScript Neednt Hurt - JavaBin talk

Example

Page 66: JavaScript Neednt Hurt - JavaBin talk

Good PracticesFirebug

jsLintUnobtrusive JavaScript

Automated testing

Page 67: JavaScript Neednt Hurt - JavaBin talk
Page 68: JavaScript Neednt Hurt - JavaBin talk

JsLint

Page 69: JavaScript Neednt Hurt - JavaBin talk
Page 70: JavaScript Neednt Hurt - JavaBin talk

Unobtrusive JavaScript

Structure vs behaviorSeparate js files

Event handler setupNamespaces

Universal Access

Page 71: JavaScript Neednt Hurt - JavaBin talk
Page 72: JavaScript Neednt Hurt - JavaBin talk
Page 73: JavaScript Neednt Hurt - JavaBin talk
Page 74: JavaScript Neednt Hurt - JavaBin talk
Page 75: JavaScript Neednt Hurt - JavaBin talk
Page 76: JavaScript Neednt Hurt - JavaBin talk

Namespace Hygiene

All your code within single object

Page 77: JavaScript Neednt Hurt - JavaBin talk

Universal Access

Can all your users use your site?Users without JS?

Blind users with screen readers?Use progressive enhancement

Page 78: JavaScript Neednt Hurt - JavaBin talk

Crossbrowser Dev Process

Frameworks > raw DOM Clean, disciplined code

Test early, test often

Page 79: JavaScript Neednt Hurt - JavaBin talk

Automated Testing

See the next talk... :)

Page 80: JavaScript Neednt Hurt - JavaBin talk

References & Further Study

Page 81: JavaScript Neednt Hurt - JavaBin talk
Page 82: JavaScript Neednt Hurt - JavaBin talk
Page 83: JavaScript Neednt Hurt - JavaBin talk

Web Resourceshttp://javascript.crockford.comhttp://cjohansen.no/javascript

http://ajaxian.com

Page 84: JavaScript Neednt Hurt - JavaBin talk

Best Way to Learn:

Start Building!

http://ajaxian.com/archives/writing-a-javascript-tetris-lessons-learned-from-a-ruby-chap

Page 85: JavaScript Neednt Hurt - JavaBin talk

Contact [email protected]

linkedin.com/in/thomaskjeldahlnilssontwitter.com/thomanil