SlideShare una empresa de Scribd logo
1 de 87
The Inclusive Web
                 Hands on with
                HTML5 and jQuery




            Justin Obara & Colin Clark
                Inclusive Design Research Centre
                                  fluidproject.org
A bit about us, quickly
!"#$

Decapod
What is accessibility?
Rethinking Disability
Rethinking Disability
Rethinking Disability

   A mismatch between the
     user
   and the
     user interface
Disability is a usability issue
Disability is contextual
Designing for Context
Disability is environmental
Accessibility is...


      the ability of the system
to accommodate the needs of the user
the web today
jQuery Hits the Spot
jQuery Hits the Spot

• Browser inconsistencies and bugs
jQuery Hits the Spot

• Browser inconsistencies and bugs
• Complexity of the DOM
jQuery Hits the Spot

• Browser inconsistencies and bugs
• Complexity of the DOM
• Handling events and asynchrony
jQuery Hits the Spot

•   Browser inconsistencies and bugs
•   Complexity of the DOM
•   Handling events and asynchrony
•   Communicating with the server
Toolkits can help!
•   Browser Abstraction
•   Complexity of the DOM
•   Handling events and asynchrony
•   Communicating with the server
Toolkits can help!
•   Browser abstraction
•   A simple, unified API for the DOM
•   Handling events and asynchrony
•   Communicating with the server
Toolkits can help!
•   Browser abstraction
•   A simple, unified API for the DOM
•   Easy, functional events system
•   Communicating with the server
Toolkits can help!
•   Browser abstraction
•   A simple, unified API for the DOM
•   Easy, functional events system
•   Built-in AJAX, XML, and JSON
Without jQuery

function stripeListElements() {

   // get the items from the list

   var myItems = document.getElementsByTagName("li");

   // skip line 0 as it's the header row

   for(var i = 0; i < myItems.length; i++) {

   
   if ((i % 2) === 0) {

   
   
     myItems[i].className = "striped";

   
   }

   }
  }
With jQuery


 jQuery("li");
With jQuery


jQuery("li:even");
With jQuery


jQuery("li:even").addClass("striped");
Accessible
systems are...

  • Flexible
  • Separable
  • Modifiable
Graceful Degradation
Markup

<!-- Only shown if browser doesn't support JavaScript -->
<label for="..." class="fl-progEnhance-basic">Add File:</label>

<!-- Only shown if JavaScript is turned on -->
<div class="fl-progEnhance-enhanced">




                                  It’s just a couple of classes!
Styles

.fl-progEnhance-enhanced {display:none}
.fl-progEnhance-basic {}




              Hide the fancy stuff, show the basics by default.
The Code

// Use JavaScript to hide basic markup.
$("head").append("<style type='text/css'>
   .fl-progEnhance-basic{ display: none; }
   .fl-progEnhance-enhanced { display: block; }
</style>");




                      Use JavaScript to flip the styles around!
how assistive technology
         works
keyboard navigation & aria
Opaque Markup
<!-- This is a Tabs widget.               -->
<!-- How would you know, looking only at the markup? -->

<ol>
  <li id="ch1Tab">
     <a href="#ch1Panel">Chapter 1</a>
  </li>
  <li id="ch2Tab">
     <a href="#ch2Panel">Chapter 2</a>
  </li>
  <li id="quizTab">
     <a href="#quizPanel">Quiz</a>
  </li>
</ol>
<div>
  <div id="ch1Panel">Chapter 1 Stuff</div>
  <div id=”ch2Panel”>Chapter 2 Stuff</div>
  <div id=”quizPanel”>Quiz Stuff</div>
</div>
Opaque Markup: Tabs
ARIA fills the gap
Roles, States, Properties

• Roles describe widgets not present in HTML 4
      slider, menubar, tab, dialog

• Properties describe characteristics:
      draggable, hasPopup, required

• States describe what’s happening:
      busy, disabled, selected, hidden
Using ARIA
<!-- Now *these* are Tabs! -->
<ol role=”tablist”>
 <li id=”ch1Tab” role=”tab”>
  <a href="#ch1Panel">Chapter 1</a>
 </li>
 <li id=”ch2Tab” role=”tab”>
  <a href="#ch2Panel">Chapter 2</a>
 </li>
 <li id=”quizTab” role=”tab”>
  <a href="#quizPanel">Quiz</a>
 </li>
</ol>
<div>
 <div id="ch1Panel" role=”tabpanel”
     aria-labelledby=”ch1Tab”>Chapter 1 Stuff</div>
 <div id=”ch2Panel” role=”tabpanel”
     aria-labelledby=”ch2Tab”>Chapter 2 Stuff</div>
 <div id=”quizPanel” role=”tabpanel”
     aria-labelledby=”quizTab”>Quiz Stuff</div>
</div>
Adding ARIA in code
// Identify the container as a list of tabs.
tabContainer.attr("role", "tablist");

// Give each tab the "tab" role.
tabs.attr("role", "tab");

// Give each panel the appropriate role,          panels.attr("role",
"tabpanel");
panels.each(function (idx, panel) {
   var tabForPanel = that.tabs.eq(idx);
   // Relate the panel to the tab that labels it.
   $(panel).attr("aria-labelledby", tabForPanel[0].id);
});
Keyboard Navigation

• Everything that works with the mouse
  should work with the keyboard
• ... but not always in the same way
• Support familiar conventions
   http://dev.aol.com/dhtml_style_guide
Keyboard Conventions
• Tab key focuses the control or widget
• Arrow keys select an item
• Enter or Spacebar activate an item
  Tab is handled by the browser. For the rest,
  you need to write code. A lot of code.
Keyboard navigation: Tabs
Tabindex examples
<!-- Tab container should be focusable -->
<ol id=”animalTabs” tabindex=”0”>
 <!-- Individual Tabs shouldn’t be focusable -->
 <!-- We’ll focus them with JavaScript instead -->
 <li id=”tab1”>
  <a href=”#cats” tabindex=”-1”>Cats</a>
 </li>
 <li id=”tab2”>
  <a href=”#cats” tabindex=”-1”>Dogs</a>
 </li>
 <li id=”tab3”>
  <a href=”#cats” tabindex=”-1”>Alligators</a>
 </li>
</ol>
Making Things Tabbable
  • Tabindex varies subtly across browsers
  • jquery.attr() normalizes it as of 1.3
  • For all the gory details:
     http://fluidproject.org/blog/2008/01/09/
       getting-setting-and-removing-tabindex-values-with-
       javascript/


// Make the tablist accessible with the Tab key.
tabContainer.attr("tabindex", "0");
// And take the anchors out of the Tab order.
$(“a”, tabs).attr("tabindex", "-1");
Adding the Arrow Keys
// Make each tab accessible with the left and right arrow keys.
tabContainer.fluid("selectable", {
   selectableSelector: that.options.selectors.tabs,
   direction: fluid.a11y.orientation.HORIZONTAL,
   onSelect: function (tab) {
      $(tab).addClass(that.options.styles.highlighted);
   },

      onUnselect: function (tab) {
        $(tab).removeClass(that.options.styles.highlighted);
      }
});
Making Them Activatable

// Make each tab activatable with Spacebar and Enter.
tabs.fluid("activatable", function (evt) {
    // Your handler code here. Maybe the same as .click()?
});
Documentation

• Tutorial:
 http://wiki.fluidproject.org/display/fluid/Keyboard+Accessibility
 +Tutorial


• API Reference:
 http://wiki.fluidproject.org/display/fluid/Keyboard+Accessibility
 +Plugin+API
the web tomorrow
“you have to use flash for that”

                  “the web can’t do that!”

       “you need an app for that!”
music and video
games
augmented reality
mobile
Beyond the buzzword...

• Media, drawing, animation, and interactivity
      <audio>, <video>, <canvas>

• New widgets—you don’t have to roll your own
      <progress>, <menu>

• Richer semantics for forms and documents
      <article>, <nav>, <input type=”date”>
Other cool stuff...

• CSS3
      transition, transform, gradient

• Working with files
      File API, FormData, XHR Level 2

• Coming soon
      Device, Text to Speech!
What about accessibility?
Making use of semantics
What’s coming

• Headings
      Based on nesting within sections

• Continued enhancements from semantics
      e.g. improved AT awareness for navigation <nav>

• Native widgets
Canvas Accessibility
Canvas Accessibility
Canvas Accessibility
1. Shadow DOM
2. Focus indicators    ... not quite yet.




 In the meantime...   1. Build alternatives
                      2. Degrade gracefully
The Bottom Line
• HTML5 is coming—experiment with it now
• Lots of great potential for improving access
• Assistive technologies are slow on the uptake
• Some features are going to be a challenge
  (Canvas)
building cool stuff
an HTML5 uploader
Features

     • Degrades gracefully
     • Uploads multiple files at once
     • Keyboard navigable
     • Uses hot new HTML5 features:

FormData   XMLHttpRequest Level 2   <progress> (almost!)
Dive right in: markup


<input type="file" multiple=""
  id="d-uploader-filesControl"
  class="d-uploader-filesControl fl-progEnhance-basic" />
Getting the files


filesControl.change(function () {
    that.events.onAdd.fire(filesControl[0].files);
});
demo.uploader.sendRequest = function (file, url, events) {
  var formData = new FormData();
  formData.append("file", file);

     // Create a new XHR.
     var xhr = new XMLHttpRequest();
     xhr.open("POST", url, true);

     // Register success and error listeners.
     xhr.onreadystatechange = function () {
        if (status === 200) {
            events.onSuccess.fire(file);
        } else {
            events.onError.fire(file);
        }
     };

     // Listen for progress events as the file is uploading.
     xhr.upload.onprogress = function (progressEvent) {
        events.onProgress.fire(file, progressEvent.loaded, progressEvent.total);
     };

     // Send off the request to the server.
     xhr.send(formData);
};
HTML5 Inputs
<input   type=”tel”> <!-- phone number -->
<input   type=”email”> <!-- e-mail address -->
<input   type=”date”> <!-- date -->
<input   type=”search”> <!-- search field -->

<!-- number field -->
<input type=”number” min=”0” max=”10” step=”1” value=”1”>

<!-- Like an autocomplete widget -->
<input list=”dlist”>
<datalist id=”dlist”><option value=”HTML5”></datalist>
HTML5 Inputs:
       attributes/properies
<label for=”name”>Name</label>
<input type=”text” id=”name” placeholder=”My name is ...”
  required autofocus />
Geolocation
// test if geolocation api is supported
if (!!navigator.geolocation) {
    // success callback is passed a location object
    // coords property holds coordinate information
    // Firefox also has an address property
    navigator.geolocation.getCurrentPosition(success, error);
}
Geolocation:
           Location Object
// test if geolocation api is supported
if (!!navigator.geolocation) {
    // success callback is passed a location object
    navigator.geolocation.getCurrentPosition(success, error);
}
What’s Infusion?

• Application framework built on top of jQuery
• UI components you can reuse and adapt
• Lightweight CSS framework for styling
• Accessibility tools and plugins for jQuery
• Open architecture: everything is configurable
Great UX is hard work

• Your code gets unruly as it grows
• UIs are hard to reuse or repurpose
• Design change requires big code change
• Accessibility is confusing
• Combining different code/libraries doesn’t
  always work
Open Architecture:
      Unlock your markup
      Let developers and users in
      A widget isn’t just one thing
      Question the rules




No Black Boxes
Transparent
   Apps
• M is where it’s at
• Events inside and out
• Assistive technology
  inside the Web, not
  bolted on
UI Options & FSS
UI Options & FSS
CSS Frameworks
“If you’re going to use a framework, it
should be yours; one that you’ve created.
You can look at existing frameworks for
ideas and hack at it. But the professionals
in this room are not well served by picking
up a framework and using it as-is.”
                               - Eric Meyer
Fluid Skinning System

• FSS is built to be hacked on
• Provides a core set of building blocks
• Reset, text, layouts, themes
• Namespaced: no conflicts with your stuff
• Themes for better legibility & readability
       http://wiki.fluidproject.org/x/96M7
https://github.com/jobara/workshops
Questions?
Justin Obara
e: jobara@ocad.ca

Colin Clark
e: cclark@ocad.ca
t: @colinbdclark


fluidproject.org
github.com/fluid-project
Photo Credits

Curb cut, Great PA-NJ, http://www.flickr.com/photos/50393252@N02/4822063888/

Stethoscope, Han-Oh Chung, http://www.flickr.com/photos/chickenlump/2038512161/

Texting while walking, Mobile Monday Amsterdam, http://www.flickr.com/photos/momoams/2926622070/

MOMA WiFi, http://www.flickr.com/photos/89554035@N00/2445178036

Plasticine iPhone, Paula Ortiz López, http://www.flickr.com/photos/paulaortizlopez/5342740603/

Skateboarder, Amin Samsudin, http://www.flickr.com/photos/aminchoc/4108543387/

Plasticine Animal, panshipanshi, http://www.flickr.com/photos/panshipanshi/2123208719/

Más contenido relacionado

La actualidad más candente

Getting started with jQuery
Getting started with jQueryGetting started with jQuery
Getting started with jQueryGill Cleeren
 
JavaScript Libraries (@Media)
JavaScript Libraries (@Media)JavaScript Libraries (@Media)
JavaScript Libraries (@Media)jeresig
 
JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)jeresig
 
Maintainable JavaScript 2012
Maintainable JavaScript 2012Maintainable JavaScript 2012
Maintainable JavaScript 2012Nicholas Zakas
 
A Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NETA Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NETJames Johnson
 
Introduction to jQuery
Introduction to jQueryIntroduction to jQuery
Introduction to jQueryZeeshan Khan
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)Doris Chen
 
jQuery (MeshU)
jQuery (MeshU)jQuery (MeshU)
jQuery (MeshU)jeresig
 
Getting the Most Out of jQuery Widgets
Getting the Most Out of jQuery WidgetsGetting the Most Out of jQuery Widgets
Getting the Most Out of jQuery Widgetsvelveeta_512
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterpriseDave Artz
 
SharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentialsSharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentialsMark Rackley
 
An in-depth look at jQuery
An in-depth look at jQueryAn in-depth look at jQuery
An in-depth look at jQueryPaul Bakaus
 
How to make Ajax Libraries work for you
How to make Ajax Libraries work for youHow to make Ajax Libraries work for you
How to make Ajax Libraries work for youSimon Willison
 
JavaScript Library Overview
JavaScript Library OverviewJavaScript Library Overview
JavaScript Library Overviewjeresig
 
jQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & TricksjQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & TricksAddy Osmani
 
jQuery Presentation
jQuery PresentationjQuery Presentation
jQuery PresentationRod Johnson
 
the 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp IIthe 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp IIDirk Ginader
 

La actualidad más candente (20)

Getting started with jQuery
Getting started with jQueryGetting started with jQuery
Getting started with jQuery
 
JavaScript Libraries (@Media)
JavaScript Libraries (@Media)JavaScript Libraries (@Media)
JavaScript Libraries (@Media)
 
JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)
 
Maintainable JavaScript 2012
Maintainable JavaScript 2012Maintainable JavaScript 2012
Maintainable JavaScript 2012
 
The jQuery Library
The  jQuery LibraryThe  jQuery Library
The jQuery Library
 
A Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NETA Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NET
 
Introduction to jQuery
Introduction to jQueryIntroduction to jQuery
Introduction to jQuery
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
 
jQuery (MeshU)
jQuery (MeshU)jQuery (MeshU)
jQuery (MeshU)
 
Getting the Most Out of jQuery Widgets
Getting the Most Out of jQuery WidgetsGetting the Most Out of jQuery Widgets
Getting the Most Out of jQuery Widgets
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] Enterprise
 
SharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentialsSharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentials
 
An in-depth look at jQuery
An in-depth look at jQueryAn in-depth look at jQuery
An in-depth look at jQuery
 
How to make Ajax Libraries work for you
How to make Ajax Libraries work for youHow to make Ajax Libraries work for you
How to make Ajax Libraries work for you
 
JavaScript Library Overview
JavaScript Library OverviewJavaScript Library Overview
JavaScript Library Overview
 
Web2.0 with jQuery in English
Web2.0 with jQuery in EnglishWeb2.0 with jQuery in English
Web2.0 with jQuery in English
 
jQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & TricksjQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & Tricks
 
jQuery Presentation
jQuery PresentationjQuery Presentation
jQuery Presentation
 
Django Heresies
Django HeresiesDjango Heresies
Django Heresies
 
the 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp IIthe 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp II
 

Destacado

Iit_teaching_aids
Iit_teaching_aidsIit_teaching_aids
Iit_teaching_aidss1047178
 
Benweir Book August2012 Lowres
Benweir Book August2012 LowresBenweir Book August2012 Lowres
Benweir Book August2012 Lowresben_weir_74
 
Flocking at the SuperCollider Symposium 2013
Flocking at the SuperCollider Symposium 2013Flocking at the SuperCollider Symposium 2013
Flocking at the SuperCollider Symposium 2013colinbdclark
 
Dwilsonlis557
Dwilsonlis557Dwilsonlis557
Dwilsonlis557nobleire
 
Accessible UIs with jQuery and Infusion
Accessible UIs with jQuery and InfusionAccessible UIs with jQuery and Infusion
Accessible UIs with jQuery and Infusioncolinbdclark
 
Palm Beach Learn Green Conference 10.15.10
Palm Beach Learn Green Conference 10.15.10Palm Beach Learn Green Conference 10.15.10
Palm Beach Learn Green Conference 10.15.10valerie11
 
Thoughts on Open Accessibility
Thoughts on Open AccessibilityThoughts on Open Accessibility
Thoughts on Open Accessibilitycolinbdclark
 
Mobile Development with uPortal and Infusion
Mobile Development with uPortal and InfusionMobile Development with uPortal and Infusion
Mobile Development with uPortal and Infusioncolinbdclark
 

Destacado (9)

Iit_teaching_aids
Iit_teaching_aidsIit_teaching_aids
Iit_teaching_aids
 
Benweir Book August2012 Lowres
Benweir Book August2012 LowresBenweir Book August2012 Lowres
Benweir Book August2012 Lowres
 
Flocking at the SuperCollider Symposium 2013
Flocking at the SuperCollider Symposium 2013Flocking at the SuperCollider Symposium 2013
Flocking at the SuperCollider Symposium 2013
 
Dwilsonlis557
Dwilsonlis557Dwilsonlis557
Dwilsonlis557
 
Accessible UIs with jQuery and Infusion
Accessible UIs with jQuery and InfusionAccessible UIs with jQuery and Infusion
Accessible UIs with jQuery and Infusion
 
Palm Beach Learn Green Conference 10.15.10
Palm Beach Learn Green Conference 10.15.10Palm Beach Learn Green Conference 10.15.10
Palm Beach Learn Green Conference 10.15.10
 
Thoughts on Open Accessibility
Thoughts on Open AccessibilityThoughts on Open Accessibility
Thoughts on Open Accessibility
 
Mobile Development with uPortal and Infusion
Mobile Development with uPortal and InfusionMobile Development with uPortal and Infusion
Mobile Development with uPortal and Infusion
 
unifi ap datasheet
unifi ap datasheetunifi ap datasheet
unifi ap datasheet
 

Similar a The Inclusive Web: hands-on with HTML5 and jQuery

Making your jQuery Plugins More Accessible
Making your jQuery Plugins More AccessibleMaking your jQuery Plugins More Accessible
Making your jQuery Plugins More Accessiblecolinbdclark
 
jQuery Features to Avoid
jQuery Features to AvoidjQuery Features to Avoid
jQuery Features to Avoiddmethvin
 
Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...Thinqloud
 
Lotusphere 2012 Speedgeeking - jQuery & Domino, a RAD Combination
Lotusphere 2012 Speedgeeking - jQuery & Domino, a RAD CombinationLotusphere 2012 Speedgeeking - jQuery & Domino, a RAD Combination
Lotusphere 2012 Speedgeeking - jQuery & Domino, a RAD CombinationSean Burgess
 
Short intro to JQuery and Modernizr
Short intro to JQuery and ModernizrShort intro to JQuery and Modernizr
Short intro to JQuery and ModernizrJussi Pohjolainen
 
Overlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh MyOverlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh MySteve McMahon
 
Mume JQueryMobile Intro
Mume JQueryMobile IntroMume JQueryMobile Intro
Mume JQueryMobile IntroGonzalo Parra
 
JavaScript Misunderstood
JavaScript MisunderstoodJavaScript Misunderstood
JavaScript MisunderstoodBhavya Siddappa
 
J Query The Write Less Do More Javascript Library
J Query   The Write Less Do More Javascript LibraryJ Query   The Write Less Do More Javascript Library
J Query The Write Less Do More Javascript Libraryrsnarayanan
 
Advancing JavaScript with Libraries (Yahoo Tech Talk)
Advancing JavaScript with Libraries (Yahoo Tech Talk)Advancing JavaScript with Libraries (Yahoo Tech Talk)
Advancing JavaScript with Libraries (Yahoo Tech Talk)jeresig
 
5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)Christian Rokitta
 
Rich Internet Applications con JavaFX e NetBeans
Rich Internet Applications  con JavaFX e NetBeans Rich Internet Applications  con JavaFX e NetBeans
Rich Internet Applications con JavaFX e NetBeans Fabrizio Giudici
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...Fabio Franzini
 

Similar a The Inclusive Web: hands-on with HTML5 and jQuery (20)

Jquery fundamentals
Jquery fundamentalsJquery fundamentals
Jquery fundamentals
 
Making your jQuery Plugins More Accessible
Making your jQuery Plugins More AccessibleMaking your jQuery Plugins More Accessible
Making your jQuery Plugins More Accessible
 
jQuery Features to Avoid
jQuery Features to AvoidjQuery Features to Avoid
jQuery Features to Avoid
 
Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...
 
Lotusphere 2012 Speedgeeking - jQuery & Domino, a RAD Combination
Lotusphere 2012 Speedgeeking - jQuery & Domino, a RAD CombinationLotusphere 2012 Speedgeeking - jQuery & Domino, a RAD Combination
Lotusphere 2012 Speedgeeking - jQuery & Domino, a RAD Combination
 
jQuery for web development
jQuery for web developmentjQuery for web development
jQuery for web development
 
Short intro to JQuery and Modernizr
Short intro to JQuery and ModernizrShort intro to JQuery and Modernizr
Short intro to JQuery and Modernizr
 
Jquery
JqueryJquery
Jquery
 
Overlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh MyOverlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh My
 
Mume JQueryMobile Intro
Mume JQueryMobile IntroMume JQueryMobile Intro
Mume JQueryMobile Intro
 
"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues
 
JavaScript Misunderstood
JavaScript MisunderstoodJavaScript Misunderstood
JavaScript Misunderstood
 
JS Essence
JS EssenceJS Essence
JS Essence
 
J query
J queryJ query
J query
 
J Query The Write Less Do More Javascript Library
J Query   The Write Less Do More Javascript LibraryJ Query   The Write Less Do More Javascript Library
J Query The Write Less Do More Javascript Library
 
Advancing JavaScript with Libraries (Yahoo Tech Talk)
Advancing JavaScript with Libraries (Yahoo Tech Talk)Advancing JavaScript with Libraries (Yahoo Tech Talk)
Advancing JavaScript with Libraries (Yahoo Tech Talk)
 
5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)
 
J Query
J QueryJ Query
J Query
 
Rich Internet Applications con JavaFX e NetBeans
Rich Internet Applications  con JavaFX e NetBeans Rich Internet Applications  con JavaFX e NetBeans
Rich Internet Applications con JavaFX e NetBeans
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 

Último

How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Scott Andery
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 

Último (20)

How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 

The Inclusive Web: hands-on with HTML5 and jQuery

  • 1. The Inclusive Web Hands on with HTML5 and jQuery Justin Obara & Colin Clark Inclusive Design Research Centre fluidproject.org
  • 2. A bit about us, quickly
  • 7. Rethinking Disability A mismatch between the user and the user interface
  • 8. Disability is a usability issue
  • 12. Accessibility is... the ability of the system to accommodate the needs of the user
  • 14.
  • 16. jQuery Hits the Spot • Browser inconsistencies and bugs
  • 17. jQuery Hits the Spot • Browser inconsistencies and bugs • Complexity of the DOM
  • 18. jQuery Hits the Spot • Browser inconsistencies and bugs • Complexity of the DOM • Handling events and asynchrony
  • 19. jQuery Hits the Spot • Browser inconsistencies and bugs • Complexity of the DOM • Handling events and asynchrony • Communicating with the server
  • 20. Toolkits can help! • Browser Abstraction • Complexity of the DOM • Handling events and asynchrony • Communicating with the server
  • 21. Toolkits can help! • Browser abstraction • A simple, unified API for the DOM • Handling events and asynchrony • Communicating with the server
  • 22. Toolkits can help! • Browser abstraction • A simple, unified API for the DOM • Easy, functional events system • Communicating with the server
  • 23. Toolkits can help! • Browser abstraction • A simple, unified API for the DOM • Easy, functional events system • Built-in AJAX, XML, and JSON
  • 24. Without jQuery function stripeListElements() { // get the items from the list var myItems = document.getElementsByTagName("li"); // skip line 0 as it's the header row for(var i = 0; i < myItems.length; i++) { if ((i % 2) === 0) { myItems[i].className = "striped"; } } }
  • 28. Accessible systems are... • Flexible • Separable • Modifiable
  • 30. Markup <!-- Only shown if browser doesn't support JavaScript --> <label for="..." class="fl-progEnhance-basic">Add File:</label> <!-- Only shown if JavaScript is turned on --> <div class="fl-progEnhance-enhanced"> It’s just a couple of classes!
  • 31. Styles .fl-progEnhance-enhanced {display:none} .fl-progEnhance-basic {} Hide the fancy stuff, show the basics by default.
  • 32. The Code // Use JavaScript to hide basic markup. $("head").append("<style type='text/css'> .fl-progEnhance-basic{ display: none; } .fl-progEnhance-enhanced { display: block; } </style>"); Use JavaScript to flip the styles around!
  • 35. Opaque Markup <!-- This is a Tabs widget. --> <!-- How would you know, looking only at the markup? --> <ol> <li id="ch1Tab"> <a href="#ch1Panel">Chapter 1</a> </li> <li id="ch2Tab"> <a href="#ch2Panel">Chapter 2</a> </li> <li id="quizTab"> <a href="#quizPanel">Quiz</a> </li> </ol> <div> <div id="ch1Panel">Chapter 1 Stuff</div> <div id=”ch2Panel”>Chapter 2 Stuff</div> <div id=”quizPanel”>Quiz Stuff</div> </div>
  • 38. Roles, States, Properties • Roles describe widgets not present in HTML 4 slider, menubar, tab, dialog • Properties describe characteristics: draggable, hasPopup, required • States describe what’s happening: busy, disabled, selected, hidden
  • 39. Using ARIA <!-- Now *these* are Tabs! --> <ol role=”tablist”> <li id=”ch1Tab” role=”tab”> <a href="#ch1Panel">Chapter 1</a> </li> <li id=”ch2Tab” role=”tab”> <a href="#ch2Panel">Chapter 2</a> </li> <li id=”quizTab” role=”tab”> <a href="#quizPanel">Quiz</a> </li> </ol> <div> <div id="ch1Panel" role=”tabpanel” aria-labelledby=”ch1Tab”>Chapter 1 Stuff</div> <div id=”ch2Panel” role=”tabpanel” aria-labelledby=”ch2Tab”>Chapter 2 Stuff</div> <div id=”quizPanel” role=”tabpanel” aria-labelledby=”quizTab”>Quiz Stuff</div> </div>
  • 40. Adding ARIA in code // Identify the container as a list of tabs. tabContainer.attr("role", "tablist"); // Give each tab the "tab" role. tabs.attr("role", "tab"); // Give each panel the appropriate role, panels.attr("role", "tabpanel"); panels.each(function (idx, panel) { var tabForPanel = that.tabs.eq(idx); // Relate the panel to the tab that labels it. $(panel).attr("aria-labelledby", tabForPanel[0].id); });
  • 41. Keyboard Navigation • Everything that works with the mouse should work with the keyboard • ... but not always in the same way • Support familiar conventions http://dev.aol.com/dhtml_style_guide
  • 42. Keyboard Conventions • Tab key focuses the control or widget • Arrow keys select an item • Enter or Spacebar activate an item Tab is handled by the browser. For the rest, you need to write code. A lot of code.
  • 44. Tabindex examples <!-- Tab container should be focusable --> <ol id=”animalTabs” tabindex=”0”> <!-- Individual Tabs shouldn’t be focusable --> <!-- We’ll focus them with JavaScript instead --> <li id=”tab1”> <a href=”#cats” tabindex=”-1”>Cats</a> </li> <li id=”tab2”> <a href=”#cats” tabindex=”-1”>Dogs</a> </li> <li id=”tab3”> <a href=”#cats” tabindex=”-1”>Alligators</a> </li> </ol>
  • 45. Making Things Tabbable • Tabindex varies subtly across browsers • jquery.attr() normalizes it as of 1.3 • For all the gory details: http://fluidproject.org/blog/2008/01/09/ getting-setting-and-removing-tabindex-values-with- javascript/ // Make the tablist accessible with the Tab key. tabContainer.attr("tabindex", "0"); // And take the anchors out of the Tab order. $(“a”, tabs).attr("tabindex", "-1");
  • 46. Adding the Arrow Keys // Make each tab accessible with the left and right arrow keys. tabContainer.fluid("selectable", { selectableSelector: that.options.selectors.tabs, direction: fluid.a11y.orientation.HORIZONTAL, onSelect: function (tab) { $(tab).addClass(that.options.styles.highlighted); }, onUnselect: function (tab) { $(tab).removeClass(that.options.styles.highlighted); } });
  • 47. Making Them Activatable // Make each tab activatable with Spacebar and Enter. tabs.fluid("activatable", function (evt) { // Your handler code here. Maybe the same as .click()? });
  • 48. Documentation • Tutorial: http://wiki.fluidproject.org/display/fluid/Keyboard+Accessibility +Tutorial • API Reference: http://wiki.fluidproject.org/display/fluid/Keyboard+Accessibility +Plugin+API
  • 50. “you have to use flash for that” “the web can’t do that!” “you need an app for that!”
  • 51.
  • 53. games
  • 56. Beyond the buzzword... • Media, drawing, animation, and interactivity <audio>, <video>, <canvas> • New widgets—you don’t have to roll your own <progress>, <menu> • Richer semantics for forms and documents <article>, <nav>, <input type=”date”>
  • 57. Other cool stuff... • CSS3 transition, transform, gradient • Working with files File API, FormData, XHR Level 2 • Coming soon Device, Text to Speech!
  • 59. Making use of semantics
  • 60. What’s coming • Headings Based on nesting within sections • Continued enhancements from semantics e.g. improved AT awareness for navigation <nav> • Native widgets
  • 63. Canvas Accessibility 1. Shadow DOM 2. Focus indicators ... not quite yet. In the meantime... 1. Build alternatives 2. Degrade gracefully
  • 64. The Bottom Line • HTML5 is coming—experiment with it now • Lots of great potential for improving access • Assistive technologies are slow on the uptake • Some features are going to be a challenge (Canvas)
  • 67. Features • Degrades gracefully • Uploads multiple files at once • Keyboard navigable • Uses hot new HTML5 features: FormData XMLHttpRequest Level 2 <progress> (almost!)
  • 68. Dive right in: markup <input type="file" multiple="" id="d-uploader-filesControl" class="d-uploader-filesControl fl-progEnhance-basic" />
  • 69. Getting the files filesControl.change(function () { that.events.onAdd.fire(filesControl[0].files); });
  • 70. demo.uploader.sendRequest = function (file, url, events) { var formData = new FormData(); formData.append("file", file); // Create a new XHR. var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); // Register success and error listeners. xhr.onreadystatechange = function () { if (status === 200) { events.onSuccess.fire(file); } else { events.onError.fire(file); } }; // Listen for progress events as the file is uploading. xhr.upload.onprogress = function (progressEvent) { events.onProgress.fire(file, progressEvent.loaded, progressEvent.total); }; // Send off the request to the server. xhr.send(formData); };
  • 71.
  • 72. HTML5 Inputs <input type=”tel”> <!-- phone number --> <input type=”email”> <!-- e-mail address --> <input type=”date”> <!-- date --> <input type=”search”> <!-- search field --> <!-- number field --> <input type=”number” min=”0” max=”10” step=”1” value=”1”> <!-- Like an autocomplete widget --> <input list=”dlist”> <datalist id=”dlist”><option value=”HTML5”></datalist>
  • 73. HTML5 Inputs: attributes/properies <label for=”name”>Name</label> <input type=”text” id=”name” placeholder=”My name is ...” required autofocus />
  • 74. Geolocation // test if geolocation api is supported if (!!navigator.geolocation) { // success callback is passed a location object // coords property holds coordinate information // Firefox also has an address property navigator.geolocation.getCurrentPosition(success, error); }
  • 75. Geolocation: Location Object // test if geolocation api is supported if (!!navigator.geolocation) { // success callback is passed a location object navigator.geolocation.getCurrentPosition(success, error); }
  • 76.
  • 77. What’s Infusion? • Application framework built on top of jQuery • UI components you can reuse and adapt • Lightweight CSS framework for styling • Accessibility tools and plugins for jQuery • Open architecture: everything is configurable
  • 78. Great UX is hard work • Your code gets unruly as it grows • UIs are hard to reuse or repurpose • Design change requires big code change • Accessibility is confusing • Combining different code/libraries doesn’t always work
  • 79. Open Architecture: Unlock your markup Let developers and users in A widget isn’t just one thing Question the rules No Black Boxes
  • 80. Transparent Apps • M is where it’s at • Events inside and out • Assistive technology inside the Web, not bolted on
  • 83. CSS Frameworks “If you’re going to use a framework, it should be yours; one that you’ve created. You can look at existing frameworks for ideas and hack at it. But the professionals in this room are not well served by picking up a framework and using it as-is.” - Eric Meyer
  • 84. Fluid Skinning System • FSS is built to be hacked on • Provides a core set of building blocks • Reset, text, layouts, themes • Namespaced: no conflicts with your stuff • Themes for better legibility & readability http://wiki.fluidproject.org/x/96M7
  • 86. Questions? Justin Obara e: jobara@ocad.ca Colin Clark e: cclark@ocad.ca t: @colinbdclark fluidproject.org github.com/fluid-project
  • 87. Photo Credits Curb cut, Great PA-NJ, http://www.flickr.com/photos/50393252@N02/4822063888/ Stethoscope, Han-Oh Chung, http://www.flickr.com/photos/chickenlump/2038512161/ Texting while walking, Mobile Monday Amsterdam, http://www.flickr.com/photos/momoams/2926622070/ MOMA WiFi, http://www.flickr.com/photos/89554035@N00/2445178036 Plasticine iPhone, Paula Ortiz López, http://www.flickr.com/photos/paulaortizlopez/5342740603/ Skateboarder, Amin Samsudin, http://www.flickr.com/photos/aminchoc/4108543387/ Plasticine Animal, panshipanshi, http://www.flickr.com/photos/panshipanshi/2123208719/

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. &amp;#x2022; This is the sort of stuff that gave JavaScript a bad name\n&amp;#x2022; These are also the issues that are the source of most code\n
  16. &amp;#x2022; This is the sort of stuff that gave JavaScript a bad name\n&amp;#x2022; These are also the issues that are the source of most code\n
  17. &amp;#x2022; This is the sort of stuff that gave JavaScript a bad name\n&amp;#x2022; These are also the issues that are the source of most code\n
  18. &amp;#x2022; This is the sort of stuff that gave JavaScript a bad name\n&amp;#x2022; These are also the issues that are the source of most code\n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n