accessible dom scripting with aria (2013)

47
Accessible DOM scripting with ARIA Léonie Watson LJWatson.co.uk @LeonieWatson 1

Upload: leonie-watson

Post on 08-May-2015

2.263 views

Category:

Technology


0 download

DESCRIPTION

Introduction to accessible DOM scripting with ARIA, including first principles, best practices and walkthrough examples.

TRANSCRIPT

Page 1: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 1

Accessible DOM scripting with ARIA

Léonie Watson

Page 2: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 2

Overview

• Anatomy of a rich internet application• First principles• Web accessibility stack• Best practices• Walkthrough examples

Page 3: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 3

Anatomy of a rich internet application

Page 4: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 4

Controls and widgets

• Controls are single elements, like checkboxes, buttons or input fields

• Widgets are composites of multiple elements, like sliders, accordions or modal dialogs

Page 5: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 5

Applications

• Rich internet applications are web applications with desktop characteristics

Page 6: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 6

First principles

Page 7: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 7

Perceivable

• Controls and widgets must provide information to assistive technologies

• Dynamic changes in content must be communicated to assistive technologies

Page 8: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 8

Operable

• Controls and widgets must be keyboard accessible

Page 9: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 9

Understandable

• Controls and widgets must be properly labelled and described

Page 10: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 10

Robust

• Controls and widgets must have reasonable backwards compatibility.

• Controls and widgets should have good forwards compatibility

Page 11: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 11

Web accessibility stack

Page 12: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 12

Layers in the web accessibility stack

• Assistive technology• Accessibility API• Accessible Rich Internet Applications (ARIA)• Document Object Model (DOM)

Page 13: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson

Understanding the web accessibility stack: DOM layer

<img src="button.gif" alt="Accept" onclick="doSomething()" onkeypress="doSomething()">

13

Page 14: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 14

Understanding the web accessibility stack: ARIA layer

<img src="button.gif" alt="Accept" onclick="doSomething()" onkeypress="doSomething()" tabindex="0" role="button">

Page 15: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 15

Best practices

Page 16: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 16

Use native HTML elements

• Do this:<p><button>Button text</button></p>

Page 17: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 17

Don’t override native semantics

• Don’t do this:<p role="button">Button text</p>

• Do this:<span role="button">Button text</span>

Page 18: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 18

Managing keyboard focus

Page 19: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 19

Make controls and widgets focusable

• Elements with tabindex="0" are part of the natural tab sequence

• Elements with tabindex="-1" are not, but are focusable with scripting

• Elements with tabindex=">0" are never a good idea

Page 20: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 20

Make focus visible

• Do this:a:focus, a:hover, a:active { text-decoration: underline;}

• Don't do this:a { text-outline:none;}

Page 21: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 21

Providing keyboard accessibility

Page 22: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 22

Use appropriate event handlers• Do this:<span tabindex="0" role="button" onclick="doSomething()" onkeypress="doSomething()"> <img src="example.png" alt="Submit"></span>

• Don't do this:<span tabindex="0" role="button" onclick="doSomething()"> <img src="example.png" alt="Submit"></span>

Page 23: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 23

Don’t cause keyboard traps

• Don't do this:<input type="text" id="user" required onblur="if(this.value=='') {this.focus();}">

• Don’t do this either:onfocus = "this.blur()"

Page 24: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 24

Don’t change context on focus

• Don't do this:<select onchange="document.location=‘http://google.com';"> …</select>

Page 25: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 25

Handling widget focus

Page 26: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 26

Give widgets a single tab stop

• A widget represents a single tab stop, and other keys are used to interact with the widget itself

Page 27: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 27

Using JavaScript to handle child focus

• Set tabindex of current child to 0, and all other children to -1

• As the user moves to another child, update the tabindex for the previous and current children accordingly

• Use element.focus() to move focus to the child with tabindex set to 0

Page 28: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 28

Using ARIA to handle child focus

• Set the tabindex of the parent element to 0, and set its aria-activedescendant property to the id of the currently active child

• As the user moves to another child, update the aria-activedescendant property accordingly

Page 29: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 29

Put the key handler on the parent element

• Captures the keystrokes, determines which element takes focus next, and updates the aria-activedesendant property

Page 30: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 30

Use the scrollIntoView() method

• Or a purpose built function, to ensure the active descendant moves into view

Page 31: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 31

Providing keyboard shortcuts

Page 32: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 32

Don’t enable keyboard shortcuts by default

• Many assistive technologies are controlled with native shortcuts

• Custom shortcuts should be clearly documented

Page 33: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 33

Cancel (or swallow) keyboard events

• Prevent the key from executing an action outside of the widget or web application, unless focus is on a form field

Page 34: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 34

Dynamically updating content

Page 35: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 35

Using CSS to show/hide content

• Use CSS when the content makes sense as part of the page, not when it’s dependent on a certain action

Page 36: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 36

Injecting content into the DOM• Do this:<div id="errors"></div><script>var errors = document.getElementById("errors");var error = document.createElement("p");

error.appendChild(document.createTextNode("You must provide a username."));errors.appendChild(error);</script>

Page 37: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 37

Using innerHTML

• Do this:<div id="errors"></div><script>var html = "";

html = html + "<li>You must enter a username</li>";html = html + "<li>Please use at least one number in your password</li>";document.getElementById("errors").innerHTML = "<ul>" + html + "</ul>";</script>

Page 38: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 38

Walkthrough examples

Page 39: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 39

Expandable content (HTML/ARIA)<div id="collapsible"> <button id="tea" aria-controls="tea-content">Types of tea</button>

<div style="display:none;" id="tea-content" aria-expanded="false"> <h2>Types of tea</h2> <ul> <li>Black tea</li> <li>Green tea</li> </ul> </div></div>

Page 40: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 40

Expandable content (JavaScript)<script>document.getElementById("tea").onclick = function() { var tea = document.getElementById("tea-content"); var expanded;

tea.style.display = (tea.style.display == "block") ? "none" : "block“; expanded = tea.getAttribute("aria-expanded") == "false" ? "true" : "false“; tea.setAttribute("aria-expanded", expanded);};</script>

Page 41: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 41

Live region updates (HTML/ARIA)<h1>Tequila</h1><p>Tequila makes me happy...</p>

<div> <button onclick="updateItems()">Add to basket</button></div>

<h2>Basket summary</h2>

<div aria-live="assertive" aria-atomic="true"> <p>Your basket contains <span id="quantity">0</span> items.</p></div>

Page 42: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 42

Live region updates (JavaScript)

<script>var items = 0;

function updateItems () { items = items + 1;document.getElementById("quantity").innerHTML=items;}</script>

Page 43: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 43

Modal dialogs (HTML/ARIA)<div> <button id="launchBtn">Open modal</button></div>

<div id="modal" style="display:none;" role="alertdialog" aria-labelledby="mdlTitle" aria-describedby="mdlMsg“><h1 id="mdlTitle">Modal title</h1><p id="mdlMsg">Modal message.</p><div><button id="ok">Ok</button><button id="cancel">Cancel</button></div></div>

Page 44: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 44

Modal dialogs (JavaScript 1)(function(){

function openModal() { modal.style.display = 'block‘; setTimeout(function () {objFirst.focus();}, 100);}

function closeModal() { modal.style.display = 'none‘; trigger.focus();}

…})();

Page 45: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 45

Modal dialogs (JavaScript 2)(function(){…

function handleKeyboard(event) { switch (event.keyCode) { case 9: if (event.target === objLast && !event.shiftKey) { objFirst.focus(); event.preventDefault(); } else if (event.target === objFirst && event.shiftKey) { objLast.focus(); event.preventDefault(); } return false; break; case 27: closeModal(); return false; break; default: return true; }}

…}

Page 46: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 46

Resources• WAI-ARIA 1.0 Authoring Practices:

http://www.w3.org/TR/wai-aria-practices/

• Using WAI-ARIA in HTML:http://www.w3.org/TR/2013/WD-aria-in-html-20130214/

• HTML to Platform Accessibility APIs Implementation Guide:http://www.w3.org/TR/html-aapi/

• The Paciello Group Blog:http://blog.paciellogroup.com/

• Open AJAX Alliance Examples:http://www.oaa-accessibility.org/examples/

Page 47: Accessible DOM Scripting with ARIA (2013)

LJWatson.co.uk @LeonieWatson 47

Thank you!