KEMBAR78
Making your Angular.js Application accessible | PDF
Making your Angular.js
Application accessible
2nd Accessibility Camp Bay Area - Dirk Ginader
http://dir.kg @ginader
Angular.js?
Angular.js
• JavaScript Framework
• allows you to extend HTML
• has powerful Data Binding
• is inaccessible
inaccessible?
NAH — of course not or this talk would be over…
Angular has a bad
reputation in terms of
accessibility
Bad Examples
Ian Pouncey: http://dir.kg/setting.an.example
<!-- A common form that includes input tags -->
<form action="getform.php" method="get">
First name: <input type="text" name="first_name" /><br />
Last name: <input type="text" name="last_name" /><br />
E-mail: <input type="email" name="user_email" /><br />
<input type="submit" value="Submit" />
</form>
http://dir.kg/setting.an.example
<li ng-repeat="item in items" ng-click="showItem(item)">
<h3>{{item.title}}</h3>
<button ng-click="remove(item)">Remove</button>
</li>
straight from stackoverflow: http://dir.kg/bad.angular.example
A solid Foundation
1. POSH
Plain Old Semantic HTML
POSH
• If it’s an action element that triggers a navigation
to another page or another section on the same
page 

—> it’s a Link! <a href=“somewhere-else”>
POSH
• Any other action

—> it’s a Button! <button>Action!</button>
When HTML isn’t
enough
2. ARIA
Accessible Rich Internet Applications
Meaningless
<div class="checkbox"></div>
Roles
<div role="checkbox"></div>
<div
role="checkbox"
></div>
Roles
<div
role="checkbox"
aria-checked="true"
></div>
States
Properties
<div
role="checkbox"
aria-checked="true"
aria-label="ARIA is Awesome"
></div>
3. Keyboard Support
Without help only Form Elements and Links are
reachable with Keyboard only
<div
role="checkbox"
aria-checked="true"
aria-label="ARIA is Awesome"
tabindex="0"
></div>
Keyboard support
Keyboard support
function a11yClick(event){
if(event.type === 'click'){
return true;
}
else if(event.type === 'keypress'){
var code = event.charCode || event.keyCode;
if((code === 32)|| (code === 13)){
return true;
}
}
else{
return false;
}
}
$('#fake-button').on('click keypress', function(event){
if(a11yClick(event) === true){
// do stuff
}
});
Karl Groves: http://dir.kg/a11yClick
4. ngAria
“The goal of ngAria is to improve Angular's default accessibility by enabling
common ARIA attributes that convey state or semantic information for assistive
technologies used by persons with disabilities.”
add as requirement…
angular.module('myApp', ['ngAria'])...
Marcy Sutton: http://dir.kg/using.ngaria
…and gain lots of instant A11y goodness
<your-awesome—checkbox
role="checkbox"
ng-model="checked"
ng-class="{active: checked}"
ng-disabled="isDisabled"
aria-disabled="false"
ng-click="toggleCheckbox()"
ng-keypress="toggleCheckbox()"
class="ng-pristine ng-valid ng-touched active"
aria-label="Custom Checkbox"
aria-checked="true"
aria-invalid=“false"
tabindex="0"
>
<span class="icon" aria-hidden="true"></span>
Custom Checkbox
</your-awesome—checkbox>
<your-awesome—checkbox
role="checkbox"
ng-model="checked"
ng-class="{active: checked}"
ng-disabled="isDisabled"
aria-disabled="false"
ng-click="toggleCheckbox()"
ng-keypress="toggleCheckbox()"
class="ng-pristine ng-valid ng-touched active"
aria-label="Custom Checkbox"
aria-checked="true"
aria-invalid=“false"
tabindex="0"
>
<span class="icon" aria-hidden="true"></span>
Custom Checkbox
</your-awesome—checkbox>
<your-awesome—checkbox
role="checkbox"
ng-model="checked"
ng-class="{active: checked}"
ng-disabled="isDisabled"
aria-disabled="false"
ng-click="toggleCheckbox()"
ng-keypress="toggleCheckbox()"
class="ng-pristine ng-valid ng-touched active"
aria-label="Custom Checkbox"
aria-checked="true"
aria-invalid=“false"
tabindex="0"
>
<span class="icon" aria-hidden="true"></span>
Custom Checkbox
</your-awesome—checkbox>
<your-awesome—checkbox
role="checkbox"
ng-model="checked"
ng-class="{active: checked}"
ng-disabled="isDisabled"
aria-disabled="false"
ng-click="toggleCheckbox()"
ng-keypress="toggleCheckbox()"
class="ng-pristine ng-valid ng-touched active"
aria-label="Custom Checkbox"
aria-checked="true"
aria-invalid=“false"
tabindex="0"
>
<span class="icon" aria-hidden="true"></span>
Custom Checkbox
</your-awesome—checkbox>
<your-awesome—checkbox
role="checkbox"
ng-model="checked"
ng-class="{active: checked}"
ng-disabled="isDisabled"
aria-disabled="false"
ng-click="toggleCheckbox()"
ng-keypress="toggleCheckbox()"
class="ng-pristine ng-valid ng-touched active"
aria-label="Custom Checkbox"
aria-checked="true"
aria-invalid=“false"
tabindex="0"
>
<span class="icon" aria-hidden="true"></span>
Custom Checkbox
</your-awesome—checkbox>
<your-awesome—checkbox
role="checkbox"
ng-model="checked"
ng-class="{active: checked}"
ng-disabled="isDisabled"
aria-disabled="false"
ng-click="toggleCheckbox()"
ng-keypress="toggleCheckbox()"
class="ng-pristine ng-valid ng-touched active"
aria-label="Custom Checkbox"
aria-checked="true"
aria-invalid=“false"
tabindex="0"
>
<span class="icon" aria-hidden="true"></span>
Custom Checkbox
</your-awesome—checkbox>
Angular Material
Material Design?
http://www.google.com/design/
Angular Material Button
https://material.angularjs.org/#/demo/material.components.button
Angular Material Checkbox
https://material.angularjs.org/#/demo/material.components.checkbox
Accessibility Warnings!
No Engineer will be happy as long as warnings littering the console…
Chrome Accessibility
Developer Tools
http://dir.kg/chrome.a11y.tools
Chrome Accessibility
Developer Tools
http://dir.kg/chrome.a11y.tools
Chrome Accessibility
Developer Tools
http://dir.kg/chrome.a11y.tools
Chrome Accessibility
Developer Tools
http://dir.kg/chrome.a11y.tools
Chrome Accessibility
Developer Tools
And the best part:
They’re becoming integral part of the Chrome Developer tool!
YAAAAY!
Bonus YAY:
Accessibility testing for
Protractor!
Accessibility testing for
Protractor with Tenon!
Thank you!
Slides at http://dir.kg/angular.a11y
http://dir.kg | @ginader

Making your Angular.js Application accessible