Blogging
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
Posts Archive for 2015
- Lessons from a Failed Experiment in JavaScript Accessibility <mmxv.v.xviii>
- Accessible Drag and Drop with Multiple Items <mmxv.iii.ix>
Posts Archive for 2014
- Good Users and Bad Passwords <mmxiv.vii.ix>
Posts Archive for 2013
- When Feature Detection Fails <mmxiii.xi.xxi>
- We Can't Rely on Color <mmxiii.x.xvi>
- The Dark Shadow of The DOM <mmxiii.viii.xxviii>
- Best Practice for Code Examples <mmxiii.viii.xix>
- When Do Elements Take the Focus? <mmxiii.vii.xxx>
- Essential Audio and Video Events for HTML5 <mmxiii.vii.xvi>
- Improving Usability With Extra Navigation Keys <mmxiii.vi.xxvi>
- Is Generated Content Actually Content? <mmxiii.v.xxix>
- Accessible Audio Descriptions for HTML5 Video <mmxiii.iv.xxix>
- 3 Neat Tricks with Regular Expressions <mmxiii.iv.xvii>
- Children of the DOM <mmxiii.iv.iv>
- Evolving a New Mutation <mmxiii.iii.xxv>
- Automation Type Conversion In The Real World <mmxiii.>
- Finding an Ancestor DOM Node <mmxiii.ii.xxiii>
- A Study in Experimental Game Development <mmxiii.ii.xv>
- Intelligent String Abbreviation <mmxiii.i.xxx>
- Instant Form Validation Using JavaScript <mmxiii.i.xxiii>
- Using Web Storage <mmxiii.i.ix>
- Fixing the details element <mmxiii.i.ii>
Posts Archive for 2012
- Parsing an ISO datestamp <mmxii.xii.xvii>
- Accessibility in Modern Interfaces <mmxii.xii.xiv>
- Creating an ISO datestamp <mmxii.xii.v>
- Practical JavaScript Accessibility <mmxii.xi.xxvi>
- Removing Useless Nodes From The DOM <mmxii.xi.xxi>
- JavaScript Accessibility 101 <mmxii.xi.xii>
- Why Would You Write Your Own CMS? <mmxii.xi.viii>
- Testing For Empty Values in JavaScript <mmxii.xi.iii>
- Adding Micro-Constructors to a Modular Design Pattern <mmxii.x.xxiv>
- A Utility Function for Padding Strings and Numbers <mmxii.x.xii>
- Modular Design Patterns: Private, Privileged, and Protected Members in JavaScript <mmxii.x.iv>
Posts Archive for 2011
- The Ever-Increasing Uses of a Zoom Layout (Part 2) <mmxi.v.xi>
- The Ever-Increasing Uses of a Zoom Layout (Part 1) <mmxi.v.x>
- The Angst of Accessibility <mmxi.v.ii>
- Better Take The Web's Temperature — It's Coming Down With Another “itis” <mmxi.iv.xxi>
- (More) Assignment in Conditions <mmxi.iv.xix>
- The Art of Accessibility <mmxi.iv.xii>
- Sophisticated Sorting in JavaScript <mmxi.iv.iv>
- What's The Best Date Format? <mmxi.iii.xxii>
Posts Archive for 2010
- Counting with an Arbitrary Character Set <mmx.xii.xxi>
- The Anatomy of a JavaScript Design Pattern <mmx.xii.viii>
- My Favorite JavaScript Design Pattern <mmx.xi.xxx>
- Why Aren't Tooltips Triggered by The Keyboard? <mmx.xi.xxiii>
- The Guilty Secrets of a Standards-Based Programmer <mmx.xi.x>
- Scripting, Loading and Irony <mmx.xi.iii>
- Throwing Better Errors Using Stack <mmx.x.xxvii>
- Assignment inside a Condition <mmx.x.xii>
- The Best Way to Instantiate Ajax? <mmx.x.v>
- The Footer's the Menu <mmx.ix.xxviii>
- Creating Shadows Around Polygons in CSS <mmx.ix.xxi>
- Contiguous Sibling Selector <mmx.ix.vii>
- Better Passwords #3: Caps-lock Warnings <mmx.viii.iii>
- Better Passwords #2: “Show Password” <mmx.vii.xxii>
- Better Passwords #1: The Masked Password Field <mmx.vii.xix>
- Creating Accurate Timers in JavaScript <mmx.vi.xxii>
- Making CSS Count Backwards <mmx.vi.xii>
- Reducing HTTP requests with generated data URIs <mmx.vi.v>
- Using CSS Text-Shadow to Create Embossed Text <mmx.iv.xxii>
- A Simple CSS Drop-Cap <mmx.iv.xv>
- How To Get Smoother Rounded Corners <mmx.iv.xiv>
- Towards A Cooler Focus Caret <mmx.iv.xiii>
- A Specialized JavaScript Library for Querying CSS <mmx.iv.v>
- Creating Beveled Images with CSS <mmx.iii.v>
- CodeBurner Updates for Firefox 3.6 <mmx.ii.xvi>
Posts Archive for 2009
- The CodeBurner Family Welcomes Three New Babies! <mmix.x.xx>
- Who's Using ARIA? <mmix.ix.xvi>
- HTML 4 Considered Harmful <mmix.vii.xxxi>
- Announcing Updates to our Popular Add-ons for Firefox 3.5 <mmix.vii.ii>
- 10 Cool Things We'll Be Able To Do Once IE6 Is Dead <mmix.iv.xiv>
- The Right Way to Make a Dropdown Menu <mmix.iv.i>
- Techy Treasures #5: Fudging CSS Counters in Internet Explorer <mmix.iii.xxxi>
- Announcing Version 1.1 of CodeBurner: the Reference Tool for Firebug <mmix.iii.xx>
- Developing CodeBurner — An Exercise in Exploratory Programming <mmix.i.xxviii>
- Introducing CodeBurner: the SitePoint HTML & CSS Reference Tool for Firebug <mmix.i.xxvii>
Posts Archive for 2008
- Techy Treasures #4: What's inside a dollar function? <mmviii.xii.x>
- Techy Treasures #3: When is a mouseout not a mouseout? <mmviii.xi.xxv>
- Techy Treasures #1: Feelin' Empty <mmviii.x.xvi>
- Tagging is Not Just for Content <mmviii.viii.xxix>
- Debugging JavaScript: Throw Away Your Alerts! <mmviii.viii.xxii>
- Using JSON for Language-independent Configuration Files <mmviii.viii.xxi>
- Regex Matching Attribute Selectors <mmviii.vii.xxix>
- Mangling XML as Text with PHP DOM <mmviii.vii.xxiv>
- Conditional Comments for HTML Email <mmviii.vii.xviii>
- Top 5 Tips for Staying Awake <mmviii.vii.iv>
- BBC Rejects hCalendar Microformat Because Of Accessibility Concerns <mmviii.vi.xxv>
- Dust-Me Selectors: Now Compatible With Firefox 3! <mmviii.vi.xxiv>
- Thanks for what? <mmviii.v.xx>
- Building The Matrix - Notes from The Architect <mmviii.v.xiv>
- You can stick your em-dash up your dot dot dot <mmviii.iv.xxx>
- You guys all suck <mmviii.iv.xxi>
- You're Fat and I Hate You <mmviii.iv.xvii>
- continue - the forgotten statement <mmviii.iv.xiv>
- A collection is not an array <mmviii.iii.xix>
- Unblocking Adblock <mmviii.ii.v>
- The Accessible Dungeon of Doom <mmviii.i.xvi>
Posts Archive for 2007
- Internet Explorer doesn't just suck, it also blows! <mmvii.xi.xxx>
- Dust-Me Selectors Version 2.0 <mmvii.xi.xxvi>
- All in the mind? <mmvii.xi.xxii>
- Dealing with unqualified HREF values (Part 2) <mmvii.x.xvii>
- Why Accessibility? Because It's Our Job! <mmvii.x.xvi>
- Comment-Driven Development <mmvii.x.x>
- How green can you be? <mmvii.x.i>
- Don't make users take responsibility for our problems <mmvii.ix.x>
- Nihilism, accessibility, and the preponderence of amazing co-incidences <mmvii.viii.xiii>
- Dealing with unqualified HREF values <mmvii.viii.x>
- What is a community? <mmvii.viii.iii>
- Find unused CSS selectors with "Dust-Me Selectors" <mmvii.vii.xxx>
- Insert in place without document.write <mmvii.vii.xi>