Taming the browser with the YUI Dom Component
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Taming the browser with the YUI Dom Component

on

  • 15,104 views

A quick introduction to the YUI Dom Component and some of its lesser known parts. This is not really *that* useful without the explanations but there will be a video later on.

A quick introduction to the YUI Dom Component and some of its lesser known parts. This is not really *that* useful without the explanations but there will be a video later on.

Statistics

Views

Total Views
15,104
Views on SlideShare
14,021
Embed Views
1,083

Actions

Likes
7
Downloads
141
Comments
0

13 Embeds 1,083

http://rhio.tistory.com 587
http://www.wait-till-i.com 231
http://christianheilmann.com 166
http://icant.co.uk 55
http://blog.ecmas4.com 19
http://www.slideshare.net 10
http://towis.net 8
http://www.towis.net 2
http://www.brijj.com 1
http://72.14.205.104 1
http://webcache.googleusercontent.com 1
http://honyaku.yahoofs.jp 1
http://pmomale-ld1 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Taming the browser with the YUI Dom Component Presentation Transcript

  • 1. Using YUI Dom to tame the Browser Christian Heilmann Yahoo! F2E Summit Asia 2007
  • 2. Quick reminder • Development according to web standards means first and foremost separation. • Specifically separation of web development layers.
  • 3. addClass batch generateId get getAncestorBy getAncestorByClassName getAncestorByTagName getChildren getChildrenBy getClientHeight getClientWidth getDocumentHeight getDocumentScrollLeft getDocumentScrollTop getDocumentWidth getElementsBy getElementsByClassName getFirstChild getFirstChildBy getLastChild getLastChildBy getNextSibling getNextSiblingBy getPreviousSibling getPreviousSiblingBy getRegion getStyle getViewportHeight getViewportWidth getX getXY getY hasClass inDocument insertAfter insertBefore isAncestor removeClass replaceClass setStyle setX setXY setY
  • 4. Use cases for the DOM utility • Using CSS Classes • Getting elements from the DOM • Using the browser dimensions • Using element dimensions • Styling elements
  • 5. Using CSS Classes • addClass() • removeClass() • hasClass() • replaceClass() • getElementsByClassName()
  • 6. Why?
  • 7. Why? • CSS is the supercharged DOM Scripting. • CSS is much closer connected to the HTML • Therefore it is more likely to change at the same time. • I hate loops.
  • 8. Why? • CSS is the supercharged DOM Scripting. • CSS is much closer connected to the HTML • Therefore it is more likely to change at the same time. • I hate loops.
  • 9. Why? • CSS is the supercharged DOM Scripting. • CSS is much closer connected to the HTML • Therefore it is more likely to change at the same time. • I hate loops.
  • 10. Why? • CSS is the supercharged DOM Scripting. • CSS is much closer connected to the HTML • Therefore it is more likely to change at the same time. • I hate loops.
  • 11. Example: Hiding all “trigger” links in a main section when JS is available.
  • 12. Example: var main = document.getElementById('main'); if(main){ var triggers = main.getElementsByTagName('a'); for(var i=0,j=triggers.length;i<j;i++){ if(triggers[i].className === 'trigger'){ triggers[i].style.display = 'none'; } } }
  • 13. Example: var main = document.getElementById('main'); if(main){ var triggers = main.getElementsByTagName('a'); for(var i=0,j=triggers.length;i<j;i++){ if(triggers[i].className === 'trigger'){ triggers[i].style.display = 'none'; } } } display:none is a bad plan!
  • 14. Example: var main = document.getElementById('main'); if(main){ var triggers = main.getElementsByTagName('a'); for(var i=0,j=triggers.length;i<j;i++){ if(triggers[i].className === 'trigger'){ triggers[i].style.display = 'none'; } } } Off-left is better.
  • 15. Example: var main = document.getElementById('main'); if(main){ var triggers = main.getElementsByTagName('a'); for(var i=0,j=triggers.length;i<j;i++){ if(triggers[i].className === 'trigger'){ triggers[i].style.position = 'absolute'; triggers[i].style.left = '-6000px'; } } }
  • 16. Magic JavaScript Pixy Solution $('#main a.trigger').hide();
  • 17. My fave: document.body.className = 'js'; // or var b = document.body; var bc = b.className; b.className = bc ? bc + ' js' : 'js';
  • 18. Getting elements from the DOM • inDocument() • isAncestor() • getElementsByClassName • getElementsBy • get • batch
  • 19. Using the browser dimensions • getViewportWidth() • getViewportHeight() • getDocumentWidth() • getDocumentHeight()
  • 20. Using element dimensions • getX(), getY(), getXY() • setX(), setY(), setXY() • getRegion() – Region union – Region intersect – Region contains
  • 21. Using element dimensions
  • 22. Using element dimensions • Each of these methods can take an ID, a reference of an HTMLelement or an array of elements as the parameter. • This allows you to easily access a lot of elements.
  • 23. Using element dimensions • The Dom utility does not care if the element is positioned absolute, relative or static. • It also sorts out differences in render mode for you. • However, each element needs to be part of the Dom and not hidden with display:none!
  • 24. Using element dimensions • The get and set methods of x and y are very straight forward. • They return the left, the top or both values in pixels or an array with this data for each element you parsed in. • You can also set the position in pixels with the setter methods.
  • 25. Using element dimensions var xy = YAHOO.util.Dom.getXY('hd'); // = [128, 0]; YAHOO.util.Dom.setXY('hd',[128,- 10]); // shifts header 10 pixels up
  • 26. Using element dimensions • By using the getRegion() method you can read out the screen estate the element occupies. • This is incredibly useful for positioning elements or avoiding overlap. • The return is an object with several properties.
  • 27. Using element dimensions var h = YAHOO.util.Dom.getRegion('hd'); // h = // {0:128 // 1:0, // top:0, // right:878, // bottom:79, // left:128}
  • 28. Using element dimensions • top, left, right, bottom are the pixel locations on the page. • There are shortcuts for left and top named 0 and 1 to allow for compatibility with setX,setY and setXY.
  • 29. Using element dimensions • Using these properties you can also calculate the dimensions of the element. • Simply subtract left from right for the width. • And top from bottom for the height.
  • 30. Using element dimensions • The Region() component does a lot more for you though. • By calculating the region occupied by two elements, you can find out: – if one element contains the other – how big the area containing both of them is and – if and where they intersect
  • 31. Using element dimensions YD = YAHOO.util.Dom; reg1 = YD.getRegion('r1'); reg2 = YD.getRegion('r2'); contains = reg1.contains(reg2); Region #1 Region #2
  • 32. Using element dimensions YD = YAHOO.util.Dom; reg1 = YD.getRegion('r1'); reg2 = YD.getRegion('r2'); contains = reg1.contains(reg2); false Region #1 Region #2
  • 33. Using element dimensions YD = YAHOO.util.Dom; reg1 = YD.getRegion('r1'); reg2 = YD.getRegion('r2'); contains = reg1.contains(reg2); Region #1 Region #2
  • 34. Using element dimensions YD = YAHOO.util.Dom; reg1 = YD.getRegion('r1'); reg2 = YD.getRegion('r2'); contains = reg1.contains(reg2); true Region #1 Region #2
  • 35. Using element dimensions YD = YAHOO.util.Dom; reg1 = YD.getRegion('r1'); reg2 = YD.getRegion('r2'); is = reg1.intersect(reg2); Region #1 Region #2
  • 36. Using element dimensions YD = YAHOO.util.Dom; reg1 = YD.getRegion('r1'); reg2 = YD.getRegion('r2'); is = reg1.intersect(reg2); Region #1 Region #2
  • 37. Using element dimensions YD = YAHOO.util.Dom; reg1 = YD.getRegion('r1'); reg2 = YD.getRegion('r2'); is = reg1.union(reg2); Region #1 Region #1 Region #2 Region #2
  • 38. Using element dimensions YD = YAHOO.util.Dom; reg1 = YD.getRegion('r1'); reg2 = YD.getRegion('r2'); is = reg1.union(reg2); Region #1 Region #1 Region #2 Region #2
  • 39. Styling elements • getStyle() • setStyle()
  • 40. Styling Elements • You might wonder why you’d need these two methods as seemingly element.style.property = value would do the same. • The two methods however work around several browser problems and differences between computedStyle and currentStyle.
  • 41. Styling Elements • The other benefit is that you can use the CSS selector names instead of the camelCased JavaScript ones. • Furthermore you can use the opacity property without needing to branch for different browsers.
  • 42. CSS normalization obj.style.marginTop = '10px'; vs. YAHOO.util.Dom.setStyle(obj, 'margin-top','10px');
  • 43. CSS normalization • Furthermore, opacity is not a nightmare any longer: YAHOO.util.Dom.setStyle(obj, 'opacity','.2');
  • 44. CSS normalization • And last but not least, float can be used: YAHOO.util.Dom.setStyle(obj, 'float','left');
  • 45. Thanks!