Title: The Theory of the Dom
1http//javascript.crockford.com/hackday.ppt
2The Misconceived Web
- The original vision of the WWW was as a
hyperlinked document-retrieval system. - It did not anticipate presentation, session, or
interactivity. - If the WWW were still consistent with TBL's
original vision, Yahoo would still be two guys in
a trailer.
3How We Got Here
- Rule Breaking
- Corporate Warfare
- Extreme Time Pressure
4The Miracle
- It works!
- Java didn't.
- Nor did a lot of other stuff.
5The Scripted Browser
- Introduced in Netscape Navigator 2 (1995)
- Eclipsed by Java Applets
- Later Became the Frontline of the Browser War
- Dynamic HTML
- Document Object Model (DOM)
6Proprietary Traps
- Netscape and LiveWire
- Microsoft and Internet Information Services
- Both server strategies frustrated by Apache
- Browser-dependent sites
7Pax Microsoft
- In the years since the end of the Browser War,
the number of browser variations in significant
use fell off significantly. - W3C attempts to unify.
- Mozilla abandoned the Netscape layer model in
favor of the W3C model. - The browser platform becomes somewhat stable.
- DHTML becomes known as Ajax.
8Browser
9Scripted Browser
10The World's Most Misunderstood Programming
Language
11Sources of Misunderstanding
- The Name
- Mispositioning
- Design Errors
- Bad Implementations
- The Browser
- Bad Books
- Substandard Standard
- JavaScript is a Functional Language
12History
- 1992
- Oak, Gosling at Sun FirstPerson
- 1995
- HotJava
- LiveScript, Eich at Netscape
- 1996
- JScript at Microsoft
- 1998
- ECMAScript
13Key Ideas
- Load and go delivery
- Loose typing
- Objects as general containers
- Prototypal inheritance
- Lambda
- Linkage though global variables
14Prototypal Inheritance
- function object(o)
- function F()
- F.prototype o
- return new F()
-
- var myNewObj object(myOldObj)
15Pseudoclassical Inheritance
function Gizmo(id) this.id
id Gizmo.prototype.toString function ()
return "gizmo " this.id function
Hoozit(id) this.id id Hoozit.prototype
new Gizmo() Hoozit.prototype.test function
(id) return this.id id
16Parasitic Inheritance
- function gizmo(id)
- return
- id id,
- toString function ()
- return "gizmo " this.id
-
-
-
- function hoozit(id)
- var that gizmo(id)
- that.test function (testid)
- return testid this.id
-
- return that
17Private
- function gizmo(id)
- return
- toString function ()
- return "gizmo " id
-
-
-
- function hoozit(id)
- var that gizmo(id)
- that.test function (testid)
- return testid id
-
- return that
18Shared Secrets
- function gizmo(id, secret)
- secret secret
- secret.id id
- return
- toString function ()
- return "gizmo " secret.id
-
-
-
- function hoozit(id)
- var secret , /final/
- that gizmo(id, secret)
- that.test function (testid)
- return testid secret.id
-
- return that
19Super Methods
- function hoozit(id)
- var secret ,
- that gizmo(id, secret),
- super_toString that.toString
- that.test function (testid)
- return testid secret.id
-
- that.toString function ()
- return super_toString.apply(that, )
-
- return that
20Inheritance Patterns
- Prototypal Inheritance works really well with
public methods. - Parasitic Inheritance works really well with
privileged and private and public methods. - Pseudoclassical Inheritance for elderly
programmers who are old and set in their ways.
21Working with the Grain
- Pseudoclassical patterns are less effective than
prototypal patterns or parasitic patterns. - Formal classes are not needed for reuse or
extension. - Be shallow. Deep hierarchies are not effective.
22JSLint
- JSLint can help improve the robustness and
portability of your programs. - It enforces style rules.
- It can spot some errors that are very difficult
to find in debugging. - It can help eliminate implied globals.
- Currently available on the web and as a
Konfabulator widget. - Soon, in text editors and Eclipse.
23Warning JSLint will hurt your feelings.
24ltscriptgtlt/scriptgt
- lt!-- // --gt
- Hack for Mosaic and Navigator 1.0.
- languagejavascript
- Deprecated.
- srcURL
- Highly recommended.
- Don't put code on pages.
- typetext/javascript
- Ignored.
25ltscriptgtlt/scriptgt
- Script files can have a big impact on page
loading time. - Place ltscript srcgt tags as close to the bottom of
the body as possible. (Also, place CSS ltlinkgt as
high in the head as possible.) - Minify and gzip script files.
- Reduce the number of script files as much as
possible. - Cache.
26document.write
- Allows JavaScript to produce HTML text.
- Before onload Inserts HTML text into the
document. - After onload Uses HTML text to replace the
current document. - Not recommended.
27Document Tree Structure
document
document. documentElement
document.body
28child, sibling, parent
29child, sibling, parent
30child, sibling, parent
31child, sibling, parent
32Walk the DOM
- Using recursion, follow the firstChild node, and
then the nextSibling nodes. - function walkTheDOM(node, func)
- func(node)
- node node.firstChild
- while (node)
- walkTheDOM(node, func)
- node node.nextSibling
-
-
33getElementsByClassName
- function getElementsByClassName(className, node)
- var results
- walkTheDOM(node document.body, function
(node) - var a, c node.className, i
- if (c)
- a c.split(' ')
- for (i 0 i lt a.length i 1)
- if (ai className)
- results.push(node)
- break
-
-
-
- )
- return results
-
34Manipulating Elements
- Old School
- if (my_image.complete)
- my_image.src superurl
-
- New School
- if (my_image.getAttribute('complete'))
- my_image.setAttribute('src', superurl)
35Style
- node.className
- node.style.stylename
- node.currentStyle.stylename Only IE
- document.defaultView().
- getComputedStyle(node, "").
- getPropertyValue(stylename)
36Style Names
- CSS
- background-color
- border-radius
- font-size
- list-style-type
- word-spacing
- z-index
- JavaScript
- backgroundColor
- borderRadius
- fontSize
- listStyleType
- wordSpacing
- zIndex
37Making Elements
- document.createElement(tagName)
- document.createTextNode(text)
- node.cloneNode()
- Clone an individual element.
- node.cloneNode(true)
- Clone an element and all of its descendents.
- The new nodes are not connected to the document.
38Linking Elements
- node.appendChild(new)
- node.insertBefore(new, sibling)
- node.replaceChild(new, old)
- old.parentNode.replaceChild(new, old)
39Removing Elements
- node.removeChild(old)
- It returns the node.
- Be sure to remove any event handlers.
- old.parentNode.removeChild(old)
40innerHTML
- The W3C standard does not provide access to the
HTML parser. - All A browsers implement Microsoft's innerHTML
property.
41Which Way Is Better?
- It is better to build or clone elements and
append them to the document? - Or is it better to compile an HTML text and use
innerHTML to realize it? - Favor clean code and easy maintenance.
- Favor performance only in extreme cases.
42Events
- The browser has an event-driven, single-threaded,
asynchronous programming model. - Events are targeted to particular nodes.
- Events cause the invocation of event handler
functions.
43Event Handlers
- Classic
- node"on" type f
- Microsoft
- node.attachEvent("on" type, f)
- W3C
- node.addEventListener(type, f, false)
44Event Handlers
- The handler takes an optional event parameter.
- Microsoft does not send an event parameter, use
the global event object instead.
45Event Handlers
- function (e)
- e e event
- var target
- e.target e.srcElement
- ...
46Trickling and Bubbling
- Trickling is an event capturing pattern which
provides compatibility with the Netscape 4 model.
Avoid it. - Bubbling means that the event is given to the
target, and then its parent, and then its parent,
and so on until the event is canceled.
47Why Bubble?
- Suppose you have 100 draggable objects.
- You could attach 100 sets of event handlers to
those objects. - Or you could attach one set of event handlers to
the container of the 100 objects.
48Cancel Bubbling
- Cancel bubbling to keep the parent nodes from
seeing the event. - e.cancelBubble true
- if (e.stopPropagation)
- e.stopPropagation()
-
- Or you can use YUI's cancelBubble method.
49Prevent Default Action
- An event handler can prevent a browser action
associated with the event (such as submitting a
form). - e.returnValue false
- if (e.preventDefault)
- e.preventDefault()
-
- return false
- Or you can use YUI's preventDefault method.
50Memory Leaks
- Memory management is automatic.
- It is possible to hang on to too much state,
preventing it from being garbage collected.
51Memory Leaks on IE 6
- Explicitly remove all of your event handlers from
nodes before you discard them. - The IE6 DOM uses a reference counting garbage
collector. - Reference counting is not able to reclaim
cyclical structures. - You must break the cycles yourself.
52Memory Leaks on IE 6
- That was not an issue for page view-driven
applications. - It is a showstopper for Ajax applications.
- It will be fixed in IE7.
53Memory Leaks on IE 6
- Remove all event handlers from deleted DOM nodes.
- It must be done on nodes before removeChild or
replaceChild. - It must be done on nodes before they are replaced
by changing innerHTML.
54Breaking Links in the DOM
- function purgeEventHandlers(node)
- walkTheDOM(node, function (e)
- for (var n in e)
- if (typeof en
- 'function')
- en null
-
-
- )
-
- Or you can use YUI's purgeElement method.
55window
- The window object is also the JavaScript global
object. - Every window, frame, and iframe has its own
unique window object. - aka self. And sometimes parent and top.
56Inter-window
- A script can access another window if
- It can get a reference to it.
- document.domain otherwindow.document.domain
- Same Origin Policy
57Cross Browser
- Weak standards result in significant
vendor-specific differences between browsers. - Graded Browser Support
- Browser Detection.
- Feature Detection.
- Platform Libraries.
58The A List
- Firefox 1.0
- Firefox 1.5
- Mozilla 1.7
- Safari 2
- IE 5.5
- IE 6
- IE 7
- Netscape 8
- Opera 9
- http//developer.yahoo.com/yui/articles/gbs/gbs_br
owser-chart.html
59Browser Detection
- Determine what kind of browser that page is
running in. - Execute conditionally.
- Brittle. Not recommended.
- The browsers lie.
- navigator.userAgent Mozilla/4.0
- http//www.mozilla.org/docs/web-developer/sniffer/
browser_type.html
60Mozilla 1.7.13
61Firefox 1.5
62Safari 2.0
63IE 6.0
64Opera 9.0
65Feature Detection
- Using reflection, ask if desired features are
present. - Execute conditionally.
- function addEventHandler(node, type, f)
- if (node.addEventListener)
- node.addEventListener(type, f, false)
- else if (node.attachEvent)
- node.attachEvent("on" type, f)
- else
- node"on" type f
-
66Feature Detection
- Using reflection, ask if desired features are
present. - Execute conditionally.
- function addEventHandler(node, type, f)
- node"on" type f
-
- YAHOO.util.Event.addListener(node, type, f)
- Support for custom events, and for adding events
to object that don't exist yet, and for purging
event handlers from objects.
67Use a Platform Library
- A platform library insolates the application from
the poisonous browsers. - YUI is highly recommended.
- http//developer.yahoo.com/yui/
68The Cracks of DOM
- The DOM buglist includes all of the bugs in the
browser. - The DOM buglist includes all of the bugs in all
supported browsers. - No DOM completely implements the standards.
- Much of the DOM is not described in any standard.
69Coping
- Do what works.
- Do what is common.
- Do what is standard.
70The Wall
- Browsers are now being push to their limits.
- Be prepared to back off.
- Reduce your memory requirements.
- Balance of client and server.
71The Hole
- The browser was not designed to be a general
purpose application platform. - Lacks a compositing model.
- Accessibility suffers.
- Lacks support for cooperation under mutual
suspicion.
72The Peace is ending.
73WWW War II
- Microsoft has awoken. They are beginning to
innovate again. - There are now 4 major browser makers.
- They will be flooding the web with bugs.
74ECMAScript
- The Fourth Edition is in development.
- Most of the new features are syntax errors in the
current browsers. - It will be years before we can use them.
- We will have to deal with the new bugs an
incompatibilities immediately. - The sad case of E4X.
75We Will Prevail
- We must use our clout to keep the browser makers
and standards bodies in line. - We must be players, not pawns.
- Ultimately, the development community must set
the standards.
76http//javascript.crockford.com/hackday.ppt