The Mysteries Of JavaScript-Fu (RailsConf Ediition)
description
Transcript of The Mysteries Of JavaScript-Fu (RailsConf Ediition)
![Page 1: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/1.jpg)
![Page 3: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/3.jpg)
“Ah, JavaScript, the language we all love to hate”
Geoffrey Grosenbach, Peepcode
![Page 4: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/4.jpg)
A peasant’s language
![Page 5: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/5.jpg)
Web 2.0 has forced ‘real’ programmers to
master it
![Page 6: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/6.jpg)
JavaScript-Fu is not easy to master
![Page 7: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/7.jpg)
The web is awash with bad examples and
worse resources
![Page 8: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/8.jpg)
Developers forced into refuge behind libraries
and frameworks
![Page 9: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/9.jpg)
![Page 10: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/10.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/11.jpg)
TRANSLATED...
❖ Working with events
❖ Working with DOM elements
❖ Optimisation
❖ Progressive enhancement
![Page 12: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/12.jpg)
THE TAO OF THE EVENT HANDLER
![Page 13: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/13.jpg)
The essence of browser scripting is defining
behavior
![Page 14: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/14.jpg)
Big differences in both browser implementation
and opinion
![Page 15: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/15.jpg)
The main battle has always been in one
area...
![Page 16: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/16.jpg)
INLINE VS SCRIPTED
![Page 17: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/17.jpg)
INLINE EVENT HANDLERS
![Page 18: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/18.jpg)
INLINE EVENT HANDLERS
Applied as soon as the browser loads the HTML
![Page 19: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/19.jpg)
INLINE EVENT HANDLERS
But what happens when there is more than one....
![Page 20: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/20.jpg)
![Page 21: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/21.jpg)
Bad JavaScript-fu
![Page 22: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/22.jpg)
SCRIPT-BASED EVENT HANDLERS
![Page 23: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/23.jpg)
Attached after element has loaded
![Page 24: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/24.jpg)
![Page 25: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/25.jpg)
Very DRY
![Page 26: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/26.jpg)
![Page 27: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/27.jpg)
Separate JavaScript out in a similar way to CSS
![Page 28: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/28.jpg)
Large numbers of event handlers choke browsers
![Page 29: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/29.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/30.jpg)
EVENT BUBBLING
<a>
<p>
<div>
<body> handler
click
![Page 31: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/31.jpg)
EVENT DELEGATION
![Page 32: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/32.jpg)
BETTER INLINE HANDLERS
![Page 33: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/33.jpg)
BETTER INLINE HANDLERS
![Page 34: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/34.jpg)
5 METHODS OF DOM FIST
![Page 35: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/35.jpg)
There are 5 methods for updating HTML
![Page 36: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/36.jpg)
3 official methods (W3C)
![Page 37: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/37.jpg)
$('kungfu').appendChild(node);
![Page 38: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/38.jpg)
$('kungfu').insertBefore(node, child);
![Page 39: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/39.jpg)
$('kungfu').replaceChild(node, child);
![Page 40: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/40.jpg)
1 non-standard method (you guessed it, from IE)
![Page 41: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/41.jpg)
![Page 42: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/42.jpg)
![Page 43: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/43.jpg)
DOM VS innerHTML
![Page 44: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/44.jpg)
DOM METHODS
![Page 45: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/45.jpg)
Insert elements with precision
![Page 46: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/46.jpg)
But you need to create the nodes first...
![Page 47: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/47.jpg)
![Page 48: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/48.jpg)
ARGH!
![Page 49: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/49.jpg)
LOWPRO’S DOM BUILDER
![Page 50: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/50.jpg)
INNERHTML
![Page 51: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/51.jpg)
Can shift large amount of HTML quickly...
![Page 52: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/52.jpg)
...but you don't getmuch control
![Page 53: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/53.jpg)
Incredibly simple to use with Ajax
![Page 54: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/54.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/55.jpg)
and the final method...
![Page 56: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/56.jpg)
THE BASTARD SON
![Page 57: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/57.jpg)
LIGHTENING SCRIPT STYLE
![Page 58: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/58.jpg)
![Page 59: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/59.jpg)
![Page 60: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/60.jpg)
~134KB
![Page 61: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/61.jpg)
5 HTTP requests
![Page 62: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/62.jpg)
Takes time to download and evaluate script
![Page 63: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/63.jpg)
The less JavaScript the better
![Page 64: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/64.jpg)
Browser normally only try to load 2 resources
concurrently
![Page 65: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/65.jpg)
Combine .js files
![Page 66: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/66.jpg)
Use GZIP compression not JS based minification
![Page 67: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/67.jpg)
Make sure everything is cachable
![Page 68: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/68.jpg)
FASTER LOOPS
![Page 69: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/69.jpg)
FASTER LOOPS
![Page 70: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/70.jpg)
BE CAREFUL WITH SELECTORS
![Page 71: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/71.jpg)
IRON AJAXTECHNIQUE
![Page 72: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/72.jpg)
RULE #1:BROWSERS
SUCK
![Page 73: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/73.jpg)
Main browsers are getting better quickly
![Page 74: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/74.jpg)
But what about the others?
![Page 75: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/75.jpg)
Corporate security and firewalls often block JavaScript
![Page 76: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/76.jpg)
The traditional answer from Rails:
![Page 77: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/77.jpg)
![Page 78: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/78.jpg)
But why turn users away if you don’t have to?
![Page 79: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/79.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/80.jpg)
It's easy to apply this to Ajax
![Page 81: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/81.jpg)
IRON AJAX
Controller
action.rhtml
_partial.rhtml
respond_to :html
render :partial
POST
![Page 82: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/82.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/83.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/84.jpg)
THE HTML
![Page 85: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/85.jpg)
THE HTML
![Page 86: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/86.jpg)
THE JAVASCRIPT
![Page 87: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/87.jpg)
THE CONTROLLER
![Page 88: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/88.jpg)
THE CONTROLLER
![Page 89: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/89.jpg)
Easy
![Page 90: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/90.jpg)
I know what you’re thinking
![Page 91: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/91.jpg)
But it won’t work if...
![Page 92: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/92.jpg)
Try progressive enhancement first
![Page 93: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/93.jpg)
LEARNING MORE
❖ Dan Webb: http://www.danwebb.net
❖ Low Pro: http://www.danwebb.net/lowpro
![Page 94: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/94.jpg)
LEARNING MORE
![Page 95: The Mysteries Of JavaScript-Fu (RailsConf Ediition)](https://reader033.fdocuments.us/reader033/viewer/2022051514/54bd178d4a7959f95e8b45a2/html5/thumbnails/95.jpg)
QUESTIONS?