+ All Categories
Home > Business > The Mysteries Of JavaScript-Fu (RailsConf Ediition)

The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Date post: 19-Jan-2015
Category:
Upload: danwrong
View: 12,213 times
Download: 0 times
Share this document with a friend
Description:
Dan Webb's 'The Mysteries Of JavaScript-Fu' as presented at RailsConf 2007.
Popular Tags:
95
Transcript
Page 1: The Mysteries Of JavaScript-Fu (RailsConf Ediition)
Page 2: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

THE MYSTERIES OF JAVASCRIPT-FU

Dan Webb ([email protected])

Page 3: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

“Ah, JavaScript, the language we all love to hate”

Geoffrey Grosenbach, Peepcode

Page 4: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

A peasant’s language

Page 5: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Web 2.0 has forced ‘real’ programmers to

master it

Page 6: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

JavaScript-Fu is not easy to master

Page 7: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

The web is awash with bad examples and

worse resources

Page 8: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Developers forced into refuge behind libraries

and frameworks

Page 9: The Mysteries Of JavaScript-Fu (RailsConf Ediition)
Page 10: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

THE ANCIENT MANUALS OF JAVASCRIPT-FU

❖ The Tao Of The Event Handler!

❖ 5 Methods Of DOM Fist!

❖ Lighting Script Style!

❖ Iron Ajax Technique!

Page 11: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

TRANSLATED...

❖ Working with events

❖ Working with DOM elements

❖ Optimisation

❖ Progressive enhancement

Page 12: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

THE TAO OF THE EVENT HANDLER

Page 13: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

The essence of browser scripting is defining

behavior

Page 14: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Big differences in both browser implementation

and opinion

Page 15: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

The main battle has always been in one

area...

Page 16: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

INLINE VS SCRIPTED

Page 17: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

INLINE EVENT HANDLERS

Page 18: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

INLINE EVENT HANDLERS

Applied as soon as the browser loads the HTML

Page 19: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

INLINE EVENT HANDLERS

But what happens when there is more than one....

Page 20: The Mysteries Of JavaScript-Fu (RailsConf Ediition)
Page 21: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Bad JavaScript-fu

Page 22: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

SCRIPT-BASED EVENT HANDLERS

Page 23: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Attached after element has loaded

Page 24: The Mysteries Of JavaScript-Fu (RailsConf Ediition)
Page 25: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Very DRY

Page 26: The Mysteries Of JavaScript-Fu (RailsConf Ediition)
Page 27: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Separate JavaScript out in a similar way to CSS

Page 28: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Large numbers of event handlers choke browsers

Page 29: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

WHICH WAY?

❖ Use script-based event handling by default

❖ If the page is large and this method results in unresponsiveness try event delegation

❖ If all else fails go for inline event handling

Page 30: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

EVENT BUBBLING

<a>

<p>

<div>

<body> handler

click

Page 31: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

EVENT DELEGATION

Page 32: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

BETTER INLINE HANDLERS

Page 33: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

BETTER INLINE HANDLERS

Page 34: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

5 METHODS OF DOM FIST

Page 35: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

There are 5 methods for updating HTML

Page 36: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

3 official methods (W3C)

Page 37: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

$('kungfu').appendChild(node);

Page 38: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

$('kungfu').insertBefore(node, child);

Page 39: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

$('kungfu').replaceChild(node, child);

Page 40: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

1 non-standard method (you guessed it, from IE)

Page 41: The Mysteries Of JavaScript-Fu (RailsConf Ediition)
Page 42: The Mysteries Of JavaScript-Fu (RailsConf Ediition)
Page 43: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

DOM VS innerHTML

Page 44: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

DOM METHODS

Page 45: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Insert elements with precision

Page 46: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

But you need to create the nodes first...

Page 47: The Mysteries Of JavaScript-Fu (RailsConf Ediition)
Page 48: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

ARGH!

Page 49: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

LOWPRO’S DOM BUILDER

Page 50: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

INNERHTML

Page 51: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Can shift large amount of HTML quickly...

Page 52: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

...but you don't getmuch control

Page 53: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Incredibly simple to use with Ajax

Page 54: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

WHICH WAY?

❖ No clear winner

❖ DOM is good for more surgical manipulation

❖ innerHTML is good for replacing large amounts of content or simple jobs

Page 55: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

and the final method...

Page 56: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

THE BASTARD SON

Page 57: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

LIGHTENING SCRIPT STYLE

Page 58: The Mysteries Of JavaScript-Fu (RailsConf Ediition)
Page 59: The Mysteries Of JavaScript-Fu (RailsConf Ediition)
Page 60: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

~134KB

Page 61: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

5 HTTP requests

Page 62: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Takes time to download and evaluate script

Page 63: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

The less JavaScript the better

Page 64: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Browser normally only try to load 2 resources

concurrently

Page 65: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Combine .js files

Page 66: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Use GZIP compression not JS based minification

Page 67: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Make sure everything is cachable

Page 68: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

FASTER LOOPS

Page 69: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

FASTER LOOPS

Page 70: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

BE CAREFUL WITH SELECTORS

Page 71: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

IRON AJAXTECHNIQUE

Page 72: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

RULE #1:BROWSERS

SUCK

Page 73: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Main browsers are getting better quickly

Page 74: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

But what about the others?

Page 75: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Corporate security and firewalls often block JavaScript

Page 76: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

The traditional answer from Rails:

Page 77: The Mysteries Of JavaScript-Fu (RailsConf Ediition)
Page 78: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

But why turn users away if you don’t have to?

Page 79: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

PROGRESSIVE ENHANCEMENT

1. Start with a working plain HTML app

2. Test if necessary browser features are there (XMLHttpRequest, canvas etc)

3. If present then apply extra JS powered features to the UI

Page 80: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

It's easy to apply this to Ajax

Page 81: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

IRON AJAX

Controller

action.rhtml

_partial.rhtml

respond_to :html

render :partial

POST

Page 82: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

IRON AJAX

Controller

action.rhtml

_partial.rhtml

respond_to :html

render :partial

POST

Ajax POST

respond_to :js

Page 83: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

IRON AJAX

Controller

action.rhtml

action.rjs

respond_to :html

render :partial

POST

Ajax POST

respond_to :js

Page 84: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

THE HTML

Page 85: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

THE HTML

Page 86: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

THE JAVASCRIPT

Page 87: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

THE CONTROLLER

Page 88: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

THE CONTROLLER

Page 89: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Easy

Page 90: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

I know what you’re thinking

Page 91: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

But it won’t work if...

Page 92: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

Try progressive enhancement first

Page 93: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

LEARNING MORE

❖ Dan Webb: http://www.danwebb.net

❖ Low Pro: http://www.danwebb.net/lowpro

Page 94: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

LEARNING MORE

Page 95: The Mysteries Of JavaScript-Fu (RailsConf Ediition)

QUESTIONS?


Recommended