An archive of blog posts at SitePoint

I've been a regular contributor to the SitePoint Blogs for many years. My posts are mostly technical, and sometimes vividly opinionated ... but always an interesting read  (smile)

Posts Archive for 2015

  1. Lessons from a Failed Experiment in JavaScript Accessibility <mmxv.v.xviii>
  2. Accessible Drag and Drop with Multiple Items <mmxv.iii.ix>

Posts Archive for 2014

  1. Good Users and Bad Passwords <mmxiv.vii.ix>

Posts Archive for 2013

  1. When Feature Detection Fails <mmxiii.xi.xxi>
  2. We Can't Rely on Color <mmxiii.x.xvi>
  3. The Dark Shadow of The DOM <mmxiii.viii.xxviii>
  4. Best Practice for Code Examples <mmxiii.viii.xix>
  5. When Do Elements Take the Focus? <>
  6. Essential Audio and Video Events for HTML5 <mmxiii.vii.xvi>
  7. Improving Usability With Extra Navigation Keys <>
  8. Is Generated Content Actually Content? <mmxiii.v.xxix>
  9. Accessible Audio Descriptions for HTML5 Video <mmxiii.iv.xxix>
  10. 3 Neat Tricks with Regular Expressions <mmxiii.iv.xvii>
  11. Children of the DOM <mmxiii.iv.iv>
  12. Evolving a New Mutation <mmxiii.iii.xxv>
  13. Automation Type Conversion In The Real World <mmxiii.>
  14. Finding an Ancestor DOM Node <mmxiii.ii.xxiii>
  15. A Study in Experimental Game Development <mmxiii.ii.xv>
  16. Intelligent String Abbreviation <>
  17. Instant Form Validation Using JavaScript <mmxiii.i.xxiii>
  18. Using Web Storage <mmxiii.i.ix>
  19. Fixing the details element <mmxiii.i.ii>

Posts Archive for 2012

  1. Parsing an ISO datestamp <mmxii.xii.xvii>
  2. Accessibility in Modern Interfaces <mmxii.xii.xiv>
  3. Creating an ISO datestamp <mmxii.xii.v>
  4. Practical JavaScript Accessibility <mmxii.xi.xxvi>
  5. Removing Useless Nodes From The DOM <mmxii.xi.xxi>
  6. JavaScript Accessibility 101 <mmxii.xi.xii>
  7. Why Would You Write Your Own CMS? <mmxii.xi.viii>
  8. Testing For Empty Values in JavaScript <mmxii.xi.iii>
  9. Adding Micro-Constructors to a Modular Design Pattern <mmxii.x.xxiv>
  10. A Utility Function for Padding Strings and Numbers <mmxii.x.xii>
  11. Modular Design Patterns: Private, Privileged, and Protected Members in JavaScript <mmxii.x.iv>

Posts Archive for 2011

  1. The Ever-Increasing Uses of a Zoom Layout (Part 2) <mmxi.v.xi>
  2. The Ever-Increasing Uses of a Zoom Layout (Part 1) <mmxi.v.x>
  3. The Angst of Accessibility <mmxi.v.ii>
  4. Better Take The Web's Temperature — It's Coming Down With Another “itis” <mmxi.iv.xxi>
  5. (More) Assignment in Conditions <mmxi.iv.xix>
  6. The Art of Accessibility <mmxi.iv.xii>
  7. Sophisticated Sorting in JavaScript <mmxi.iv.iv>
  8. What's The Best Date Format? <mmxi.iii.xxii>

Posts Archive for 2010

  1. Counting with an Arbitrary Character Set <mmx.xii.xxi>
  2. The Anatomy of a JavaScript Design Pattern <mmx.xii.viii>
  3. My Favorite JavaScript Design Pattern <>
  4. Why Aren't Tooltips Triggered by The Keyboard? <mmx.xi.xxiii>
  5. The Guilty Secrets of a Standards-Based Programmer <mmx.xi.x>
  6. Scripting, Loading and Irony <mmx.xi.iii>
  7. Throwing Better Errors Using Stack <mmx.x.xxvii>
  8. Assignment inside a Condition <mmx.x.xii>
  9. The Best Way to Instantiate Ajax? <mmx.x.v>
  10. The Footer's the Menu <mmx.ix.xxviii>
  11. Creating Shadows Around Polygons in CSS <mmx.ix.xxi>
  12. Contiguous Sibling Selector <mmx.ix.vii>
  13. Better Passwords #3: Caps-lock Warnings <mmx.viii.iii>
  14. Better Passwords #2: “Show Password” <mmx.vii.xxii>
  15. Better Passwords #1: The Masked Password Field <mmx.vii.xix>
  16. Creating Accurate Timers in JavaScript <>
  17. Making CSS Count Backwards <>
  18. Reducing HTTP requests with generated data URIs <>
  19. Using CSS Text-Shadow to Create Embossed Text <mmx.iv.xxii>
  20. A Simple CSS Drop-Cap <mmx.iv.xv>
  21. How To Get Smoother Rounded Corners <mmx.iv.xiv>
  22. Towards A Cooler Focus Caret <mmx.iv.xiii>
  23. A Specialized JavaScript Library for Querying CSS <mmx.iv.v>
  24. Creating Beveled Images with CSS <mmx.iii.v>
  25. CodeBurner Updates for Firefox 3.6 <mmx.ii.xvi>

Posts Archive for 2009

  1. The CodeBurner Family Welcomes Three New Babies! <mmix.x.xx>
  2. Who's Using ARIA? <mmix.ix.xvi>
  3. HTML 4 Considered Harmful <mmix.vii.xxxi>
  4. Announcing Updates to our Popular Add-ons for Firefox 3.5 <mmix.vii.ii>
  5. 10 Cool Things We'll Be Able To Do Once IE6 Is Dead <mmix.iv.xiv>
  6. The Right Way to Make a Dropdown Menu <mmix.iv.i>
  7. Techy Treasures #5: Fudging CSS Counters in Internet Explorer <mmix.iii.xxxi>
  8. Announcing Version 1.1 of CodeBurner: the Reference Tool for Firebug <mmix.iii.xx>
  9. Developing CodeBurner — An Exercise in Exploratory Programming <mmix.i.xxviii>
  10. Introducing CodeBurner: the SitePoint HTML & CSS Reference Tool for Firebug <mmix.i.xxvii>

Posts Archive for 2008

  1. Techy Treasures #4: What's inside a dollar function? <mmviii.xii.x>
  2. Techy Treasures #3: When is a mouseout not a mouseout? <mmviii.xi.xxv>
  3. Techy Treasures #1: Feelin' Empty <mmviii.x.xvi>
  4. Tagging is Not Just for Content <mmviii.viii.xxix>
  5. Debugging JavaScript: Throw Away Your Alerts! <mmviii.viii.xxii>
  6. Using JSON for Language-independent Configuration Files <mmviii.viii.xxi>
  7. Regex Matching Attribute Selectors <mmviii.vii.xxix>
  8. Mangling XML as Text with PHP DOM <mmviii.vii.xxiv>
  9. Conditional Comments for HTML Email <mmviii.vii.xviii>
  10. Top 5 Tips for Staying Awake <mmviii.vii.iv>
  11. BBC Rejects hCalendar Microformat Because Of Accessibility Concerns <>
  12. Dust-Me Selectors: Now Compatible With Firefox 3! <>
  13. Thanks for what? <mmviii.v.xx>
  14. Building The Matrix - Notes from The Architect <mmviii.v.xiv>
  15. You can stick your em-dash up your dot dot dot <>
  16. You guys all suck <mmviii.iv.xxi>
  17. You're Fat and I Hate You <mmviii.iv.xvii>
  18. continue - the forgotten statement <mmviii.iv.xiv>
  19. A collection is not an array <mmviii.iii.xix>
  20. Unblocking Adblock <mmviii.ii.v>
  21. The Accessible Dungeon of Doom <mmviii.i.xvi>

Posts Archive for 2007

  1. Internet Explorer doesn't just suck, it also blows! <>
  2. Dust-Me Selectors Version 2.0 <mmvii.xi.xxvi>
  3. All in the mind? <mmvii.xi.xxii>
  4. Dealing with unqualified HREF values (Part 2) <mmvii.x.xvii>
  5. Why Accessibility? Because It's Our Job! <mmvii.x.xvi>
  6. Comment-Driven Development <mmvii.x.x>
  7. How green can you be? <mmvii.x.i>
  8. Don't make users take responsibility for our problems <mmvii.ix.x>
  9. Nihilism, accessibility, and the preponderence of amazing co-incidences <mmvii.viii.xiii>
  10. Dealing with unqualified HREF values <mmvii.viii.x>
  11. What is a community? <mmvii.viii.iii>
  12. Find unused CSS selectors with "Dust-Me Selectors" <>
  13. Insert in place without document.write <mmvii.vii.xi>

Like to read more?

Check out the articles list, plus there are more articles and commentary in the reference section.

So how can I help you?

Please do get in touch, and let me know what you need.

Our internal search engine is currently offline, undergoing some configuration changes in preparation for a major site overhaul. In the meantime, you can still search this site using Google Custom Search.

In this area

Main areas

[brothercake] a round peg in a square hole, that still fits