index.html
344 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"/><title>WAI-ARIA 1.0 Authoring Practices</title><link href="spec.css" rel="stylesheet" type="text/css"/><link href="http://www.w3.org/StyleSheets/TR/W3C-WD" rel="stylesheet" type="text/css"/></head><body>
<p align="center">[<a href="#toc">contents</a>]</p>
<div class="head"> <a href="http://www.w3.org/"><img alt="W3C" height="48" src="http://www.w3.org/Icons/w3c_home" width="72"/></a>
<h1><abbr title="Accessible Rich Internet Applications">WAI-ARIA</abbr> 1.0 Authoring Practices</h1>
<h2 id="subhead">An author's guide to understanding and implementing Accessible Rich Internet Applications</h2>
<h2 class="maturity">W3C Working Draft 16 September 2010</h2>
<dl><dt>This version:</dt><dd><a href="http://www.w3.org/TR/2010/WD-wai-aria-practices-20100916/">http://www.w3.org/TR/2010/WD-wai-aria-practices-20100916/</a></dd><dt>Latest version:</dt><dd> <a href="http://www.w3.org/TR/wai-aria-practices/">http://www.w3.org/TR/wai-aria-practices/</a> </dd><dt>Previous version:</dt><dd><a href="http://www.w3.org/TR/2009/WD-wai-aria-practices-20091215/">http://www.w3.org/TR/2009/WD-wai-aria-practices-20091215/</a></dd><dt>Editors: </dt><dd>Joseph Scheuhammer, Invited Expert<br clear="none"/>
Michael Cooper, W3C<br clear="none"/>
</dd><dt>Previous Editors:</dt><dd> Lisa Pappas, Society for Technical Communication<br clear="none"/>
Richard Schwerdtfeger, IBM</dd></dl>
<p class="copyright"><a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © 2007 - 2010 <a href="http://www.w3.org/"><acronym title="World Wide Web Consortium">W3C</acronym></a><sup>®</sup> (<a href="http://www.csail.mit.edu/"><acronym title="Massachusetts Institute of Technology">MIT</acronym></a>, <a href="http://www.ercim.eu/"><acronym title="European Research Consortium for Informatics and Mathematics">ERCIM</acronym></a>, <a href="http://www.keio.ac.jp/">Keio</a>), All Rights Reserved. W3C <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>, <a href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a> and <a href="http://www.w3.org/Consortium/Legal/copyright-documents">document use</a> rules apply.</p>
<hr title="Separator from Header"/>
</div>
<div id="abstract">
<h2>Abstract</h2>
<p>This WAI-ARIA Authoring Practices Guide provides readers with an understanding of how to use <cite><a href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/">WAI-ARIA</a></cite> [<cite><a href="#ref_ARIA">ARIA</a></cite>] to create accessible rich internet applications. It describes considerations that might not be evident to most authors from the WAI-ARIA specification alone and recommends approaches to make widgets, navigation, and behaviors accessible using WAI-ARIA roles, states, and properties. This document is directed primarily to Web application developers, but the guidance is also useful for user agent and assistive technology developers. This document is part of the WAI-ARIA suite described in the <a href="http://www.w3.org/WAI/intro/aria.php">WAI-ARIA Overview</a>.</p>
</div>
<div> <a id="sotd" name="sotd"></a>
<h2>Status of This Document</h2>
<p><em>This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the <a href="http://www.w3.org/TR/">W3C technical reports index</a> at http://www.w3.org/TR/.</em></p>
<p>This is a Public Working Draft by the <a href="http://www.w3.org/WAI/PF/">Protocols & Formats
Working Group</a> of the <a href="http://www.w3.org/WAI/">Web Accessibility
Initiative</a>. It supports the <cite><a href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/">Accessible
Rich Internet Applications (WAI-ARIA)</a></cite> [<cite><a href="#ref_ARIA">ARIA</a></cite>]
specification, providing detailed advice and examples beyond what would
be appropriate to a technical specification but which are important
to understand the specification. This version incorporates changes
made in response to public comments received on the previous
version. A <a href="http://www.w3.org/WAI/PF/aria-practices/change-history">history
of changes to WAI-ARIA 1.0 Authoring Practices</a> is available. Refer
to the <a href="http://www.w3.org/WAI/PF/comments/actions?document_version_id%5B%5D=2&document_version_id%5B%5D=7">summary
of actions made in response to comments on the previous two drafts</a> and
the <a href="http://www.w3.org/WAI/PF/comments/issue_disposition_report?document_version_id%5B%5D=2&document_version_id%5B%5D=7">issue
disposition report for the previous two drafts</a>. </p>
<p>Feedback on the information provided here is essential to the ultimate success of Rich Internet Applications that afford full access to their information and operations. The PFWG asks in particular:</p>
<ul><li> Is it clear how to create accessible Rich Internet Applications?</li><li> Is the usage of roles, states, and properties clear? </li><li> Are the various types of rich Web content covered? </li><li>Are considerations beyond the use of WAI-ARIA sufficiently explained? </li><li>Is the relationship of this document to the WAI-ARIA specification clear? </li><li>Are the <a href="#aria_ex">design patterns</a> clear?</li></ul>
<p>Start with the <a href="http://www.w3.org/WAI/PF/comments/instructions">instructions for commenting</a> page to submit comments (preferred), or send email to <a href="mailto:public-pfwg-comments@w3.org">public-pfwg-comments@w3.org</a> (<a href="http://lists.w3.org/Archives/Public/public-pfwg-comments/">comment archive</a>). Comments should be made by <strong>29 October 2010</strong>. In-progress updates to the document may be viewed in the <a href="/WAI/PF/aria-practices/">publicly visible editors' draft</a>.</p>
<p>Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.</p>
<p>This document was produced by a group operating under the <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/">5 February 2004 W3C Patent Policy</a>. The group does not expect this document to become a W3C Recommendation. W3C maintains a <a href="http://www.w3.org/2004/01/pp-impl/32212/status" rel="disclosure">public list of any patent disclosures</a> made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential">Essential Claim(s)</a> must disclose the information in accordance with <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure">section 6 of the W3C Patent Policy</a>.</p>
<p>The disclosure obligations of the Participants of this group are described in the <a href="http://www.w3.org/WAI/PF/charter201006#patentpolicy">charter</a>.</p>
</div>
<div><a id="toc" name="toc"></a>
<h2>Table of Contents</h2>
<ol class="toc"><li>1. <a href="#intro">Introduction</a></li><li>2. <a href="#accessiblewidget">General Steps for Building an Accessible Widget with WAI-ARIA</a></li><li>3. <a href="#keyboard">Keyboard and Structural Navigation</a><ol class="toc"><li>3.1. <a href="#kbd_generalnav">Providing Keyboard Navigation for Widgets</a><ol class="toc"><li>3.1.1. <a href="#kbd_general_binding">WAI-ARIA Keyboard Bindings and Behaviors</a></li><li>3.1.2. <a href="#kbd_general_between">Keyboard Navigation between Widgets</a></li><li>3.1.3. <a href="#kbd_general_within">Keyboard Navigation within Widgets</a></li><li>3.1.4. <a href="#kbd_shortcuts">Keyboard Shortcuts for Widgets</a></li><li>3.1.5. <a href="#kbd_general_ex">Example Keyboard Operation: Radio Group/Radio</a></li><li>3.1.6. <a href="#kbd_general_other">Other Widget Authoring Practices</a></li></ol></li><li>3.2. <a href="#kbd_focus">Providing Keyboard Focus</a><ol class="toc"><li>3.2.1. <a href="#focus_tabindex">Using Tabindex to Manage Focus among Widgets</a></li><li>3.2.2. <a href="#focus_activedescendant">Using activedescendant to Manage Focus for Widget Children</a></li><li>3.2.3. <a href="#visualfocus">Managing Visual Focus with tabindex Alone</a></li><li>3.2.4. <a href="#scrollintoview">Managing Focus with Scroll</a></li><li>3.2.5. <a href="#dualfocus">Managing the Perception of a Dual Focus</a></li><li>3.2.6. <a href="#AuthDefKeys">Author-Defined Keyboard Short-Cuts or Mnemonics</a></li><li>3.2.7. <a href="#kbd_layout">Providing Navigable Structure within Web Pages</a></li></ol></li><li>3.3. <a href="#modal_dialog">Making a Dialog Modal</a><ol class="toc"><li>3.3.1. <a href="#trap_focus_div">Trapping Focus</a></li></ol></li></ol></li><li>4. <a href="#relations">Relationships</a><ol class="toc"><li>4.1. <a href="#relations_labeling">Labeling and Describing</a><ol class="toc"><li>4.1.1. <a href="#LabeledBy">Labeling</a></li><li>4.1.2. <a href="#Descriptions">Describing</a></li></ol></li><li>4.2. <a href="#relations_owning">Owning and Controlling</a><ol class="toc"><li>4.2.1. <a href="#relations_owns">The Owns Relationship</a></li><li>4.2.2. <a href="#relations_owns_reuse"> Using Owns with Reusable Content</a></li><li>4.2.3. <a href="#relations_controls">The Controls Relationship</a></li></ol></li><li>4.3. <a href="#relations_flowto">Changing the Reading Flow</a></li><li>4.4. <a href="#relations_haspopup">Popups and drop-downs</a></li></ol></li><li>5. <a href="#docmgt">Managing Dynamic Changes</a><ol class="toc"><li>5.1. <a href="#ContentPresChanges">Managing Content and Presentational Changes</a></li><li>5.2. <a href="#LiveRegions">Implementing Live Regions</a><ol class="toc"><li>5.2.1. <a href="#liveprops">Live Region Properties and How to Use Them</a></li></ol></li><li>5.3. <a href="#chobet">Choosing Between Special Case Live Regions</a></li></ol></li><li>6. <a href="#ariaform">Form Properties</a></li><li>7. <a href="#math">Math</a></li><li>8. <a href="#dragdrop">Drag-and-Drop Support</a></li><li>9. <a href="#aria-write">States and Properties Modified by an External Assistive Technology</a></li><li>10. <a href="#aria_ex">Design Patterns</a></li><li>11. <a href="#reuse_comp_lib">Reusable Component Libraries</a></li><li>12. <a href="#appendices">Appendices</a><ol class="toc"><li>12.1. <a href="#references">References</a></li><li>12.2. <a href="#acknowledgements">Acknowledgments</a><ol class="toc"><li>12.2.1. <a href="#ack_group">Participants in the PFWG at the time of publication</a></li><li>12.2.2. <a href="#ack_others">Other previously active PFWG participants and other contributors to the Accessible Rich Internet Applications specification</a></li><li>12.2.3. <a href="#ack_funders">Enabling funders</a></li></ol></li></ol></li></ol>
</div>
<div class="section" id="intro">
<h2><span class="tocnum">1. </span> Introduction</h2>
<p>This section is <em>informative.</em></p>
<p>The WAI-ARIA Authoring Practices Guide is intended to provide readers with an understanding of how to use WAI-ARIA to create an accessible Rich Internet Application. As explained in the <a href="http://www.w3.org/TR/2010/WD-wai-aria-primer-20100916/">WAI-ARIA Primer</a>, accessibility deficiencies in today's markup render rich internet applications unusable by people who use assistive technologies (AT) or who rely on keyboard navigation. The W3C Web Accessibility Initiative's (WAI) Protocols and Formats working group (PFWG) plans to address these deficiencies through several W3C standards efforts, with a focus on the WAI-ARIA specifications. </p>
<p>For an introduction to WAI-ARIA, see the <a href="http://www.w3.org/WAI/intro/aria.php">Accessible Rich Internet Applications Suite (WAI-ARIA) Overview</a>. The WAI-ARIA Authoring Practices Guide is part of a set of resources that support the WAI-ARIA specification. The practices describe recommended usage patterns for web content developers, and the <cite><a href="http://www.w3.org/TR/2010/WD-wai-aria-primer-20100916/">WAI-ARIA Primer</a></cite> [<cite><a href="#ref_ARIA-PRIMER">ARIA-PRIMER</a></cite>] provides a basic introduction to the concepts behind and reason for WAI-ARIA. The WAI-ARIA suite fills gaps identified by the <a href="http://www.w3.org/TR/2008/WD-wai-aria-roadmap-20080204/">Roadmap for Accessible Rich Internet Applications (<acronym title="Web Accessibility Initiative">WAI</acronym>-<cite><acronym title="Accessible Rich Internet Applications">WAI-ARIA</acronym></cite> Roadmap)</a> [<cite><a href="#ref_ARIA-ROADMAP">ARIA-ROADMAP</a></cite>]. These documents serve as important places of clarification where topics appear to be unclear.</p>
<p>With the conceptual basis provided in the WAI-ARIA Primer, you should have a good understanding of how WAI-ARIA provides for interoperability with assistive technologies and support for a more usable, accessible experience. This guide begins by providing some general steps for building an accessible widget using WAI-ARIA, script, and CSS. It then extends your knowledge of WAI-ARIA with detailed guidance on how to make rich internet applications keyboard accessible. Next, the scope widens to include the full application, addressing necessary layout and structural semantics within the Web page. These semantics are critical to enable assistive technologies to provide a usable experience when processing rich internet applications with rich documents on the same page. It includes guidance on dynamic document management; use of WAI-ARIA Form properties; WAI-ARIA Drag and Drop; and then the creation of WAI-ARIA-enabled alerts and dialogs. The appendix provides substantial reference information including code samples for developers of user agents, assistive technologies, and Web pages. </p>
<p class="note">WAI-ARIA markup is currently not included in (X)HTML. The W3C WAI PF working group will be creating DTDs for XHTML 1.0 and HTML 4.01 for those wishing to validate their markup with WAI-ARIA embedded into these host languages. </p>
</div>
<div class="section" id="accessiblewidget">
<h2><span class="tocnum">2. </span> General Steps for Building an Accessible Widget with WAI-ARIA</h2>
<p>At this point you should have a basic understanding of how WAI-ARIA is used to support interoperability with assistive technologies. If you are not reusing a WAI-ARIA-enabled widget library and wish to create your own the following steps will guide you through the thought process for creating an accessible widget using WAI-ARIA. </p>
<ol><li>
<p><strong>Pick the widget type (role) from the WAI-ARIA taxonomy</strong></p>
<p>WAI-ARIA provides a <cite><a href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles.html">role taxonomy</a></cite> ([<cite><a href="#ref_ARIA">ARIA</a></cite>], Section 3.4) constituting the most common UI component types. Choose the role type from the provided table. If your desire was to create a toolbar set the role to toolbar:</p>
<pre class="example" xml:space="preserve"><span class="tag"><div role=<span class="str">"toolbar"</span>></span></pre>
</li><li><strong>From the role, get the list of supported states and properties</strong>
<p> Once you have chosen the role of your widget, consult the <cite><a href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/">WAI-ARIA specification</a></cite> [<cite><a href="#ref_ARIA">ARIA</a></cite>] for an in-depth definition for the role to find the supported states, properties, and other attributes. For example, the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#toolbar"><code>toolbar</code></a> role definition includes:</p>
<dl><dt>parent role</dt><dd>In the taxonomy the widget you selected inherits states and properties from this role. In the case of a toolbar you will see that a toolbar is a subclass of a group. This makes sense given that a toolbar is a collection of commonly used functions.</dd><dt>related concept</dt><dd>This is really more informative to state what other concepts are similar to this role. These may exist in different host languages outside WAI-ARIA.
The keyboard model
for the control should emulate that of the related concept control. </dd><dt>supported states and properties</dt><dd>These are unique states and properties that this widget supports and that were not inherited from its ancestors in the taxonomy. In the case of a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#toolbar"><code>toolbar</code></a> there are no such states or properties. However, in the case of a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listbox"><code>listbox</code></a>, you may choose to set the property of <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-multiselectable"><code>aria-multiselectable</code></a> to true if you were to have more than one item in the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listitem"><code>listitem</code></a> selected at a time. This indicates to the assistive technology that the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listbox"><code>listbox</code></a> manages a collection of selectable options.</dd><dt>inherited states and properties</dt><dd>These are all the states and properties which are inherited from the roles's ancestors and which you may use. </dd><dt>global states and properties</dt><dd>These are states and properties which apply to all host language components regardless of whether a role is set or not. You may use these as well. </dd></dl>
<p>Once you have chosen the states and properties that apply to your widget you must set those properties you will use to set their initial values. Note: You do not need to use all the states and properties available for your role. In our case we shall use:</p>
<pre class="example" xml:space="preserve"><span class="tag"><div role=<span class="str">"toolbar"</span> tabindex=<span class="str">"0"</span> id=<span class="str">"customToolbar"</span>
onkeydown=<span class="str">"return optionKeyEvent(event);"</span>
onkeypress=<span class="str">"return optionKeyEvent(event);"</span>
onblur=<span class="str">"hideFocus()"</span>
onfocus=<span class="str">"showFocus()"</span>
></span>
<span class="tag"><img src=<span class="str">"img/btn1.gif"</span> tabindex=<span class="str">"0"</span> title=<span class="str">"Home"</span>
role=<span class="str">"button"</span> id=<span class="str">"b1"</span> alt=<span class="str">"Home"</span>
onClick=<span class="str">"updateText('Home was invoked');"</span>></span>
<span class="tag"><img src=<span class="str">"img/btn2.gif"</span> tabindex=<span class="str">"-1"</span> title=<span class="str">"Refresh"</span>
role=<span class="str">"button"</span> id=<span class="str">"b2"</span> alt=<span class="str">"Refresh"</span>
onClick=<span class="str">"updateText('Refresh was invoked');"</span>></span>
<span class="tag"><img src=<span class="str">"img/btn3.gif"</span> tabindex=<span class="str">"-1"</span> title=<span class="str">"Help"</span>
role=<span class="str">"button"</span> id=<span class="str">"b3"</span> alt=<span class="str">"Help"</span>
onClick=<span class="str">"updateText('Help was invoked');"</span>></span>
<span class="tag"></div></span>
</pre>
<p> By avoiding <code>tabindex</code> on the toolbar and setting <code>tabindex=0</code> on the first button, but <code>tabindex=-1</code> on the others, we have specified that the first button in the toolbar will receive focus in the document order. It is then necessary to use script to change the focus amongst the buttons from there. </p>
<div class="note">
<p>Important: When embedding WAI-ARIA markup in (X) HTML, all WAI-ARIA states and properties must be preceded with the characters <code>aria-</code> with the exception of the <code>role</code> and <code>tabindex</code> attributes. Otherwise, the user agent will not map the WAI-ARIA information, resulting in it not being recognized by assistive technologies. </p>
<p>When embedding WAI-ARIA into other host languages, <code>tabindex</code> does not carry over. The WAI-ARIA <code>tabindex</code> extensions are specific to (X)HTML to repair deficiencies in keyboard support. </p>
</div>
</li><li><strong>Establish the widget structure in the markup (parent/child)</strong>
<p>Assistive technologies are very dependent on the structure of widgets as well as general document structure. Structure provides context to the user. A toolbar is a collection of common functions made available to the user. Therefore, all functions you would like in the toolbar must be contained within it. This can be determined by using the <cite><a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/">Document Object Model</a></cite> [<cite><a href="#ref_DOM">DOM</a></cite>] tree structure created by the browser when parsing the host language. By using the parent child relationship of the DOM, an assistive technology can determine all the related toolbar widgets associated with the toolbar. The toolbar widgets would be DOM children of the "toolbar" container. For our purposes we will define three image buttons for cut, copy, and paste.</p>
<pre class="example" xml:space="preserve"><span class="tag"><div role=<span class="str">"toolbar"</span> tabindex=<span class="str">"0"</span> aria-activedescendant=<span class="str">"button1"</span>></span>
<span class="tag"><img src=<span class="str">"buttoncut.png"</span> alt=<span class="str">"cut"</span> id=<span class="str">"button1"</span>></span>
<span class="tag"><img src=<span class="str">"buttoncopy.png"</span> alt=<span class="str">"copy"</span> id=<span class="str">"button1"</span>></span>
<span class="tag"><img src=<span class="str">"buttonpaste.png"</span> alt=<span class="str">"paste"</span> id=<span class="str">"button1"</span>></span>
<span class="tag"></div></span> </pre>
</li><li><strong>Repeat steps 1-3 for the children of the parent</strong>
<p>We now need to assign the roles and states for each of the children. However, we shall save the detailed navigation for step 5.</p>
<pre class="example" xml:space="preserve"><span class="tag"><div role=<span class="str">"toolbar"</span> tabindex=<span class="str">"0"</span> aria-activedescendant=<span class="str">"button1"</span>></span>
<span class="tag"><img src=<span class="str">"buttoncut.png"</span> alt=<span class="str">"cut"</span> role=<span class="str">"button"</span> id=<span class="str">"button1"</span>></span>
<span class="tag"><img src=<span class="str">"buttoncopy.png"</span> alt=<span class="str">"copy"</span> role=<span class="str">"button"</span> id=<span class="str">"button2"</span>></span>
<span class="tag"><img src=<span class="str">"buttonpaste.png"</span> alt=<span class="str">"paste"</span> role=<span class="str">"button"</span> id=<span class="str">"button3"</span>></span>
<span class="tag"></div></span>
</pre>
<p>The process of setting roles and states may be a recursive procedure if the children themselves have children, such as in the case of an expandable/collapsible <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tree"><code>tree</code></a> widget.</p>
</li><li>
<p><strong>Establish keyboard navigation of the widget and plan for how it will be navigated to within the document</strong></p>
<p>It is very important that your widget be keyboard accessible. In fact, there must be a keyboard equivalent for every mouse operation. Where possible you should refer to the <a href="#aria_ex">WAI-ARIA examples</a> in this guide for tips on how to implement keyboard navigation for your widget. If you find that an example is not provided, you should follow standard keyboard bindings for UI components such as those used for the Java Foundation Classes for Windows 95/NT.</p>
<p>For our toolbar, we have chosen to have the toolbar manage the focus for its children and through the use of the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> property. We have also chosen to have the toolbar receive focus based on the tab order by using <code>tabindex</code>. In order to use <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a>, each focusable descendant must have an assigned ID. </p>
<pre class="example" xml:space="preserve"> <span class="tag"><head></span>
<span class="tag"><script></span>
...
function optionKeyEvent(event)
{
var tb = event.target;
var buttonid;
DOM_VK_ENTER = 13;
// Partial sample code for processing arrow keys
if (event.type == "keydown") {
if (event.altKey) {
return true; // Browser should use this, the menu view doesn't need alt-modified keys
}
// XXX Implement circular keyboard navigation within the toolbar buttons
if (event.keyCode == DOM_VK_ENTER) {
ExecuteButtonAction(getCurrentButtonID()); // This is an author defined function
}
else if (event.keyCode == event.DOM_VK_RIGHT) {
// Change the active toolbar button to the one to the right (circular) by
var buttonid = getNextButtonID(); // This is an author defined function
tb.setAttribute("aria-activedescendant", buttonid);
}
else if (event.keyCode == event.DOM_VK_LEFT) {
// Change the active toolbar button to the one to the left (circular) by
var buttonid = getPrevButtonID(); // This is an author defined function
tb.setAttribute("aria-activedescendant", buttonid);
}
else {
return true;
}
return false;
}
else if (event.type == "keypress") {
...
}
}
<span class="tag"></script></span>
<span class="tag"><div role=<span class="str">"toolbar"</span> tabindex=<span class="str">"0"</span> aria-activedescendant=<span class="str">"button1"</span> id=<span class="str">"tb1"</span>
onkeydown=<span class="str">"return optionKeyEvent(event);"</span>
onkeypress=<span class="str">"return optionKeyEvent(event);"</span>></span>
<span class="tag"><img src=<span class="str">"buttoncut.png"</span> alt=<span class="str">"cut"</span> role=<span class="str">"button"</span> id=<span class="str">"button1"</span>></span>
<span class="tag"><img src=<span class="str">"buttoncopy.png"</span> alt=<span class="str">"copy"</span> role=<span class="str">"button"</span> id=<span class="str">"button2"</span>></span>
<span class="tag"><img src=<span class="str">"buttonpaste.png"</span> alt=<span class="str">"paste"</span> role=<span class="str">"button"</span> id=<span class="str">"button3"</span>></span>
<span class="tag"></div></span></pre>
<p>The details of implementing keyboard navigation are described in <a href="#keyboard">Keyboard and Structural Navigation</a> section of this document.</p>
<p class="note">Note: You must also show the visual focus for each element that has focus. </p>
</li><li>
<p><strong>Apply and manage needed WAI-ARIA states in response to user input events</strong></p>
<p>Similar to the processing of <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> in Step 5, as author you must set any additional WAI-ARIA states and properties on document elements.</p>
</li><li>
<p><strong>Synchronize the visual UI with accessibility states and properties for supporting user agents</strong></p>
<p>You should consider binding user interface changes directly to changes in WAI-ARIA states and properties, such as through the use of <a href="http://www.w3.org/TR/1998/REC-CSS2-19980512/selector.html#attribute-selectors">CSS attribute selectors</a>. For example, the setting of the <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-selected"><code>aria-selected</code> (state)</a> state may change the background of a selected <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#treeitem"><code>treeitem</code></a> in a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tree"><code>tree</code></a>. This may also be done with JavaScript.</p>
<pre class="example" xml:space="preserve">
.treeitem[role="treeitem"][aria-selected="true"] {color: white; background-color: #222222;}
.treeitem[role="treeitem"][aria-selected="false"] {color: white; background-color: beige;} </pre>
<p>Authors should be aware that CSS attribute selectors are not supported in some browsers, such as Internet Explorer 6. A consistent way to apply styling to reflect WAI-ARIA semantics would be to assign an element a class name based on the WAI-ARIA attribute being set using script as shown here:</p>
<pre class="example" xml:space="preserve">function setSelectedOption(menuItem)
{
if (menuItem.getAttribute("role") != "menuitem") {
return;
}
var menu = getMenu(menuItem);
var oldMenuItem = getSelectedOption(menu);
// Set class so that we show selection appearance
oldMenuItem.className="unselected";
menu.setAttribute("aria-activedescendant", menuItem.id);
menuItem.className= "selected";
}</pre>
</li><li> <strong>Showing and Hiding Sections in a Widget</strong>
<p> The proper synchronization of showing and hiding sections in a widget with the WAI-ARIA display state is also critical. Some platform accessibility <abbr title="Application Programming Interfaces">APIs</abbr> provide events for applications to notify the assistive technology when pop-ups such as menus, alerts, and dialogs come into view or go away. Rich Internet applications can assist browsers which support these conventions by: </p>
<ol><li>
<p> Creating an entire section and then insert it into the <cite><a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/">Document Object Model</a></cite> [<cite><a href="#ref_DOM">DOM</a></cite>], as a subtree of the parent element activated to show the pop-up, and then removing the section from the inserted area when the pop-up goes away.</p>
<p>OR</p>
</li><li>
<p>Using the following style sheet properties to show and hide document sections being used to represent the pop-up items, menus or dialogs:</p>
<ul><li><code>display:block</code></li><li><code>display:none</code></li><li><code>visibility:visible</code></li><li><code>visibility:hidden</code></li></ul>
<p>By monitoring these behaviors a user agent may use this information to notify assistive technology that the pop-up has occurred by generating the appropriate accessibility <abbr title="Application Programming Interface">API</abbr> event. </p>
</li></ol>
<p>Some assistive technologies may use the DOM directly to determine these when pop-up occurs. In this case, the first mechanism of writing a section to the DOM would work using the DOM events as demonstrated here. </p>
<pre class="example" xml:space="preserve">
// create new table row with table cell and div
var newTr = document.createElement('TR');
var newTd = document.createElement('TD');
var newDiv = document.createElement('DIV');
newTr.appendChild(newTd);
newTd.appendChild(newDiv);
//insert this new table row before the Node selected
var container = theNode.parentNode;
container.insertBefore(newTr, theNode);
//remove theNode selected
container.removeChild(theNode);"</pre>
<p>However, if you are using CSS to show and hide sections of the DOM (2) it is essential that you set the corresponding WAI-ARIA <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-hidden"><code>aria-hidden</code> (state)</a> property to indicate that the section is visible or hidden and synchronize it with your CSS styling as shown here: </p>
<pre class="example" xml:space="preserve">[aria-hidden=true] {visibility: hidden;}
...
<span class="tag"><div role=<span class="str">"button"</span> aria-haspopup=<span class="str">"true"</span> aria-owns=<span class="str">"mypopupmenu"</span>></span>
<span class="tag"><div role=<span class="str">"menu"</span> aria-hidden=<span class="str">"true"</span> id=<span class="str">"mypopupmenu"</span>></span>...<span class="tag"></div></span></pre>
</li><li><strong>Support basic accessibility, such as alternative text on images</strong>
<p>When an image is used to represent information within a component, such as image buttons, you need to set the alternative text on those images. This is then mapped by the user agent to the accessible name in the platform accessibility API. Using our example:</p>
<pre class="example" xml:space="preserve"><span class="tag"><div role=<span class="str">"toolbar"</span> tabindex=<span class="str">"0"</span> aria-activedescendant=<span class="str">"button1"</span> id=<span class="str">"tb1"</span>
onkeydown=<span class="str">"return optionKeyEvent(event);"</span>
onkeypress=<span class="str">"return optionKeyEvent(event);"</span>></span>
<span class="tag"><img src=<span class="str">"buttoncut"</span> role=<span class="str">"button"</span> id=<span class="str">"button1"</span> alt=<span class="str">"cut"</span>></span>
<span class="tag"><img src=<span class="str">"buttoncopy"</span> role=<span class="str">"button"</span> id=<span class="str">"button2"</span> alt=<span class="str">"copy"</span>></span>
<span class="tag"><img src=<span class="str">"buttonpaste"</span> role=<span class="str">"button"</span> id=<span class="str">"button3"</span> alt=<span class="str">"paste"</span>></span>
<span class="tag"></div></span></pre>
</li><li><strong>Establish WAI-ARIA relationships between this widget and others</strong>
<p>Once you have made the basic widget accessible you may then need to establish its relationship to other widgets. Examples of this are <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a>, <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a>, <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-flowto"><code>aria-flowto</code></a>. The details of using these relationships are described in the <a href="#relations">Relationships</a> section of this document. </p>
<p>Other relationships which should be considered are more declarative and provide context to the widget within a set. For these, <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-level"><code>aria-level</code></a>, <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-posinset"><code>aria-posinset</code></a>, and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-setsize"><code>aria-setsize</code></a> are provided. If you structure your Document Object Model appropriately so that the user agent can determine this information from it using the DOM hierarchy directly, you do not need to set these properties. There are, however, situations in rich internet applications where all the elements in a container are not in the DOM at one time, such as when you can only render the ten of fifty items in a subtree. In this case the user agent cannot determine the number of tree items (<a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-setsize"><code>aria-setsize</code></a>) for the position in the set (<a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-posinset"><code>aria-posinset</code></a>), and potentially the tree depth (<a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-level"><code>aria-level</code></a>) from the DOM. In these situations you will need to provide these WAI-ARIA properties.</p>
</li><li>
<p><strong>Review widget to ensure that you have not hard coded sizes</strong></p>
<p>The ability for applications to respond to system font settings is a requirement. Most user agents are designed to meet this requirement. This also means your Web application running within your browser is impacted when the user agent changes the font sizes to meet the need. If you have hard coded your font size in pixels an increase in system fonts will not be reflected in your Web application. You must also not hard code the size of your widgets in pixels either. If the fonts are scalable, but the widget they are encapsulated in is not, then the text could flow outside your widget. </p>
<p>Follow these rules to allow your application to respond to system font settings:</p>
<ul><li>Establish a base set of font sizes used in widgets based on percentage of the container element font size.</li><li>Use <abbr title="Cascading Style Sheets">CSS</abbr> width, borders, margin, padding, background, and positioning properties to specify the graphical rendering of widgets and their sub-components, use percentage units or em units to specify widths of widget components (An em is a the font unit of measure between the top and bottom of an upper case letter M.). Border widths, padding, and margins can use <abbr title="pixel">PX</abbr> units.</li><li>Use scripting for run time CSS positioning of widget sub-components in relation to other sub components.</li><li>Make sure all widgets use consistent height and width units of measure.</li></ul>
<p>
Percentages are the most reliable way to consistently specify proportional text sizes in widgets. The use of percentages and em should be used for specifying widths of a widget and the widget sub components. The use of percentages for text size and percentages and em units for widths support browser zoom capabilities to make widgets larger or smaller.
Pixels can be used for specifying line widths, padding and margins.</p>
<p class="note"> <em>Important: Most browsers today have a zoom feature which allow the user to magnify the entire Web page. Most legislation today requires that your application respond to system font and color settings and therefore you will want to consider the fact the system settings could adversely affect your Web page should you decide to hard code pixel sizes.</em> </p>
</li><li> <strong>Test with User agent, Assistive Technology, and People with disabilities</strong>
<p>To ensure you have set your WAI-ARIA semantics correctly, test your application with your user agent, an assistive technology, and a person with disability. Example assistive technologies are screen readers and screen magnifiers. Ensure that your user agent is designed to support WAI-ARIA and their your assistive technology is designed to support WAI-ARIA in the selected user agent.</p>
<p>Finding people with disabilities to do testing may be difficult but many companies employ people with disabilities, including your customers, and you should reach out to them to ask for help. Other places to look are advocacy groups like the National Federation of the Blind or your local schools for the blind, reading and learning centers, and so on. The people you reach out to may someday need to use what you produce.</p>
</li></ol>
</div>
<div class="section" id="keyboard">
<h2><span class="tocnum">3. </span> Keyboard and Structural Navigation</h2>
<p>Providing an effective navigation experience to the user is critical for usability. This section starts with guidance on how to provide effective keyboard navigation for widgets in a Rich Internet Application environment. This includes a discussion on how to manage keyboard focus and the specifics on providing keyboard navigation for tooltips. This is is followed by a broader discussion on how to convey structural semantics for the entire Web page. These semantics help an assistive technology provide additional navigation, increase user productivity, and render the page in an alternative formats. This rendering may be in different forms, including but not limited to speech, page restructuring, and alternative input solutions.</p>
<div class="section" id="kbd_generalnav">
<h3><span class="tocnum">3.1. </span> Providing Keyboard Navigation for Widgets</h3>
<div class="section" id="kbd_general_binding">
<h4><span class="tocnum">3.1.1. </span> WAI-ARIA Keyboard Bindings and Behaviors</h4>
<p> Essential to accessible Web 2.0 widgets is keyboard support to provide full operation and functionality of a widget through keyboard-only events. Unlike traditional HTML form controls, Web 2.0 widgets, typically, have no inherent keyboard support. The developer must enable keyboard support for the widgets they create or use widget libraries with keyboard support. The model for keyboard support for Web 2.0 widgets are graphical user interface (GUI) operating systems like Microsoft Windows, Mac OS X; and other desktop operating systems like GNOME and GTK. Basic accessibility requirements for keyboard focus include: </p>
<ul><li>Support users who cannot use pointing devices due to physical or visual impairment to access the full functionality of the Web application. </li><li>All major software and Web accessibility guidelines for people with disabilities require keyboard-only operation of the interface for accessibility. </li><li>Communicate accessibility information to assistive technologies on the type of widget and its associated state and properties. </li></ul>
<p>For example, if a screen reader user hears a tree announced, they know that pressing the right arrow key will expand a node. Similarly, when they hear a grid announced, they know they can use their screen reader's table reading commands. </p>
</div>
<div class="section" id="kbd_general_between">
<h4><span class="tocnum">3.1.2. </span> Keyboard Navigation between Widgets</h4>
<p> The <code>tabindex</code> attribute enables focus to be moved via keyboard to HTML elements. For standard <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>, tabindex was limited to form and anchor elements. For WAI-ARIA, the <code>tabindex</code> attribute is now applicable to all renderable HTML elements with additional functionality designed to help the author produce keyboard accessible Web 2.0 widgets. </p>
<ul><li><kbd>Tab</kbd> and <kbd>Shift+Tab</kbd> key move focus among widgets and standard HTML controls. </li><li>Widgets with tabindex=0 will be added to the tab sequence based on document order </li><li>Widgets with tabindex>0 will be added to the tab sequence based on the TABINDEX value </li><li>Widgets with tabindex<0 will not be added to the tab sequence but are enabled to receive keyboard focus. </li></ul>
<p>Once a widget has keyboard focus, arrow keys, <kbd>Space</kbd>, Enter key, or other keyboard commands can be used to navigate the options of the widget, change its state, or trigger an application function associated with the widget. </p>
</div>
<div class="section" id="kbd_general_within">
<h4><span class="tocnum">3.1.3. </span> Keyboard Navigation within Widgets</h4>
<p> Each element that receives keyboard focus needs to have a <code>tabindex</code> attribute set to its current active descendant element and itself if an active descendant does not exist. The element with keyboard focus is essential because it communicates information about the widget to assistive technologies like screen readers and magnifiers through operating specific accessibility APIs like Microsoft Active Accessibility (MSAA), the Apple AX APIs, and the ATK Accessibility Toolkit. The TAB key moves keyboard focus to the widget, and other keys operate the features of the widget, typically cursor keys, Enter key and <kbd>Space</kbd>. The actual keys are up to the developer, but best practices recommend using the same key bindings that are used to control similar widgets in common GUI operating systems like Microsoft Windows, Mac OS X and other desktop operating systems like GNOME and GTK. </p>
<p> JavaScript can use either the focus() method to move focus to the appropriate element in the widget, or it can use a WAI-ARIA property called <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> on the actual widget container to indicate which element in the widget must have focus. The following procedure should be followed when focus is completely dependent on the use of tabindex to provide focus in a widget:</p>
<ul><li> Set tabindex="0" to the current active descendant in the widget while setting tabindex="-1" on all the other child elements of the widget</li><li>As the user navigates (e.g. arrows) away from an item, the old item gets a tabindex="-1" and the new item gets tabindex="0".</li><li>Use the javascript method to set focus, using its JavaScript focus() method, on the item whose tabindex="-1"</li></ul>
<p><a id="roving" name="roving"></a>This procedure creates a <em>roving</em> tabindex. If you tab away and the tab back to the widget, the same last active descendant becomes active again. This relieves the author from having to compute and set the focus to the last activedescendant. </p>
<p>Conversely, if you use the WAI-ARI <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> property things get a lot easier: </p>
<ul><li>Set tabindex="0" on the element which is the composite widget, and set its activedescendant property to the id of the child you wish to be active,</li><li>As the user navigates (e.g. arrows) away from an item in the widget, refresh the activedescendant property on the containing widget to the id of the new active descendant child. </li></ul>
<p>The browser will then be responsible for managing focus changes for you. For greater detail, see <a href="#focus_tabindex">Using Tabindex to Manage Focus Among Widgets</a>. In both scenarios the author must indicate through styling and/or markup which element in the widget has focus or is "active." </p>
</div>
<div class="section" id="kbd_shortcuts">
<h4><span class="tocnum">3.1.4. </span> Keyboard Shortcuts for Widgets</h4>
<p>It is useful to provide keyboard access to widgets, to focus a widget directly and to activate the features within the widget. These may be "mnemonics" that use a letter from the label of the control, as well as other special keys that perform familiar operations on the system. When providing non-standard key commands, document them so the user knows how to use them.</p>
<p>When localizing the user interface, it may be necessary to localize keyboard mnemonics as well in order to keep them apparent. Be sure not to introduce key conflicts when doing this, and ensure that the correct key commands remain apparent to the user.</p>
</div>
<div class="section" id="kbd_general_ex">
<h4><span class="tocnum">3.1.5. </span> Example Keyboard Operation: Radio Group/Radio </h4>
<p> See working <a href="http://test.cita.uiuc.edu/aria/radio/" title="CITA Radio Button Examples">Radio button examples</a> from the University of Illinois.</p>
<table summary="two-column table with one heading row where column one lists a key and column two describes the response to that key press in a radio button group"><caption>
Key Bindings for Radio Group Behavior - Example
</caption><tr><th rowspan="1" colspan="1">Key</th><th rowspan="1" colspan="1">Description of Radio Group Behavior</th></tr><tr><td rowspan="1" colspan="1">Tab Key</td><td rowspan="1" colspan="1"> If no radio button is checked, focus moves to the first radio button in the group, but the radio button remains unchecked. If one radio button is checked, focus moves to the checked radio button. If SHIFT+TAB is pressed, focus moves to the last radio button in the group, but the radio button remains unchecked. </td></tr><tr><td rowspan="1" colspan="1">Space Bar</td><td rowspan="1" colspan="1"> Checks the radio button with keyboard focus (this is a special case when using tab and no radio buttons have been marked as checked). </td></tr><tr><td rowspan="1" colspan="1">Down Arrow</td><td rowspan="1" colspan="1">If no button is checked, check the first radio button. If the last radio button is checked, check the first radio button. Otherwise, move the check from the current radio button to the next radio button. </td></tr><tr><td rowspan="1" colspan="1">Up Arrow</td><td rowspan="1" colspan="1">If no button is checked, check the last radio button. If the first radio button is checked, check the last radio button. Otherwise, move the check from the current radio button to the previous radio button. </td></tr></table>
<p>In this Radio Group example, the <code>tabindex</code> of the first and last radio button elements has a <code>tabindex="0"</code> (assuming none of the radio buttons is checked), the remaining radio elements have <code>tabindex="-1"</code>. As soon as the first or the last radio button receives focus it changes the <code>tabindex</code> value of the other radio button to -1. If none of the radio buttons is selected the and the keyboard focus leaves the group the first and the last radio buttons have their <code>tabindex</code> values set to 0. </p>
</div>
<div class="section" id="kbd_general_other">
<h4><span class="tocnum">3.1.6. </span> Other Widget Authoring Practices</h4>
<p>The <a href="#aria_ex_widget">Common Widget Design Patterns</a> section of this document contains best practices, such as keyboard navigation, for creating common widgets found on the Web. This section contains miscellaneous authoring practices that you should also consider.</p>
<div class="section" id="kbd_general_valuenow">
<h5><span class="tocnum">3.1.6.1. </span> Maintain a valid format for aria-valuenow</h5>
<p>
It is essential that application vendors maintain a valid format for
<a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuenow"><code>aria-valuenow</code></a>, and aria-valuenow should
accurately represent the value of the widget.The value must be within range of <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuemin"><code>aria-valuemin</code></a> and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuemin"><code>aria-valuemin</code></a>, where the value of aria-valuemin is less than or equal to the value of aria-valuemax, throughout the life cycle of your widget. If aria-valuemin is not less than or equal to the value of aria-valuemax, or if the aria-valuemax is indeterminate, this creates an error condition that will be handled by
the assistive technology, resulting in undesirable results. Should an alternative text
equivalent be needed to properly represent the aria-valuenow, such as a day
of the week, then you should accompany the aria-valuenow with an appropriate
aria-valuetext equivalent such as in this example: </p>
<pre xml:space="preserve">
<span class="tag"><div role=<span class="str">"slider"</span> aria-valuenow=<span class="str">"1"</span>
aria-valuemin=<span class="str">"1"</span> aria-valuemax=<span class="str">"7"</span>
aria-valuetext=<span class="str">"Sunday"</span>></span>
</pre>
<p>
Here the values 1 through 7 represent the days of the week and
aria-valuenow of 1 is equivalent to the first day of the week or Sunday.When aria-valuetext is made available aria-valuenow should also be treated as an index which is 1 based. </p>
</div>
</div>
</div>
<div class="section" id="kbd_focus">
<h3><span class="tocnum">3.2. </span> Providing Keyboard Focus</h3>
<p>One way to provide keyboard support in (X)HTML is with form and list elements that accept keyboard focus by default. With the <kbd>Tab</kbd> key, the user can navigate to these types of elements. However, when building sophisticated widgets, it's necessary to be able to control keyboard navigation exactly. Authors may require or prefer to use host language elements that do not have built-in keyboard navigation features. For example, the author may wish to provide keyboard navigation without altering the tab order. Navigating within large composite widgets such as tree views, menubars, and spreadsheets can be very tedious and is inconsistent with what users are familiar with in their desktop counterparts. The solution is to provide full keyboard support using the arrow keys to provide more intuitive navigation within the widget, while allowing Tab and <kbd>Shift</kbd>+Tab to move focus out of the widget to the next place in the tab order. </p>
<p> A tenet of keyboard accessibility is reliable, persistent indication of focus. The author is responsible, in the scripts, for maintaining visual and programmatic focus and observing accessible behavior rules. Screen readers and keyboard-only users rely on focus to operate rich internet applications with the keyboard. </p>
<div class="section" id="focus_tabindex">
<h4><span class="tocnum">3.2.1. </span> Using Tabindex to Manage Focus among Widgets</h4>
<p>One requirement for supporting the keyboard is to allow focus to be set to any element. The <a href="http://www.w3.org/TR/html401/interact/forms.html#adef-tabindex" title="HTML4 tabindex attribute ">tabindex</a> attribute can be used to include additional elements in the tab order and to set programmatic focus to them. Originally implemented in Internet Explorer 5, the feature has been extended to Opera, Firefox, and Mozilla. The following table outlines the use of the tabindex attribute: </p>
<div>
<table border="1" cellspacing="0" summary="three-column table with one heading row where column one lists the Tabindex attribute, column two indicates how the element takes focus, and column three describes the tab navigation"><caption>
Use of the Tabindex Attribute
</caption><tbody><tr><th rowspan="1" colspan="1">Tabindex Attribute</th><th rowspan="1" colspan="1">Focusable with mouse or JavaScript via element.focus()</th><th rowspan="1" colspan="1">Tab Navigation</th></tr><tr><td rowspan="1" colspan="1"><p>not present</p></td><td rowspan="1" colspan="1">Follows default behavior of element (only form controls and anchors can receive focus.)</td><td rowspan="1" colspan="1">Follows default behavior of element</td></tr><tr><td rowspan="1" colspan="1"><p>zero - tabindex="0"</p></td><td rowspan="1" colspan="1">yes</td><td rowspan="1" colspan="1">In tab order relative to element's position in document</td></tr><tr><td rowspan="1" colspan="1"><p>Positive - tabindex="X" (where X is a positive integer between 1 and 32768)</p></td><td rowspan="1" colspan="1">yes</td><td rowspan="1" colspan="1">Tabindex value directly specifies where this element is positioned in the tab order.</td></tr><tr><td rowspan="1" colspan="1"><p>Negative - tabindex="-1"</p></td><td rowspan="1" colspan="1">yes</td><td rowspan="1" colspan="1">No, author must focus it with element.focus() as a result of arrow or other key press</td></tr></tbody></table>
</div>
<p>Setting a tabindex value of -1 to an element enables the element to receive focus via JavaScript using the element.focus() method. This method is used to enable arrow key navigation to elements. Each element that can be navigated to via arrow keys must have a tabindex of -1 to enable it to receive focus. Here are just a few additional tips to help you with managing keyboard focus:</p>
<ul><li>
<p><em>Use focus and blur events (or event delegation) to track the current focus</em> - <code>focus</code> and <code>blur</code> events can now be used with every element. There is no standard DOM interface to get the current element with keyboard focus, so authors may keep track of it with a <a href="https://developer.mozilla.org/en/JavaScript" title="JavaScript">JavaScript</a> variable. Don't assume that all focus changes will come via key and mouse events, because assistive technologies such as screen readers can set the focus to any focusable element, and that needs to be handled elegantly by the JavaScript widget. Techniques such as "event delegation" (for example, intercepting events on a list rather than on every listitem) can greatly increase web application performance and code maintainability, and authors are encouraged to use JavaScript best practices whenever possible. </p>
</li><li>
<p><em>Follow keydowns to move focus</em> - A keydown event handler can determine the next object to receive focus and call that element's focus() method. </p>
</li><li>
<p><em>Use onkeydown to trap key events, not onkeypress</em> - Key press events do not fire for all keys and they vary across browsers. </p>
</li><li>
<p><em>Dynamically change focusability using the tabIndex property</em> - You may want to update tabindex values if a custom control becomes disabled or enabled. Disabled controls should not be in the tab order. However, you can typically arrow to them if they're part of grouped navigation widget. When an element receives focus, it should change the tabindex value to 0 to make an element the default element of the widget. This is important if the user leaves the widget and returns to the widget again so focus is on the last element of the widget the user was on. If other elements of a widget can receive keyboard focus, only one element of the widget should have a tabindex value of 0.</p>
</li><li>
<p><em>Use element.focus() to set focus</em> - Do not use createEvent(), initEvent() and dispatchEvent() to send focus to an element, because these functions do not change the focus. DOM focus events are informational only, generated by the user agent after an element has acquired focus, but not used themselves to set focus.</p>
</li><li>
<p>The use of :focus pseudo-class selectors to style the keyboard focus is not supported in many versions of Internet Explorer. Authors should use the :active pseudo-class (which older versions of IE treat like :focus) in conjunction with the :focus pseudo-class. Example: a:focus, a:active { text-decoration: underline; } </p>
<p>If the related CSS pseudo-classes are not appropriate or not supported in all browsers, authors can use JavaScript techniques to indicate an appropriate focus alternative, such as using focus and blur events to toggle a classname on an element.</p>
</li><li>
<p><em>Always draw the focus for tabindex="-1" items and elements that receive focus programmatically when supporting versions of Internet Explorer older than 8</em> - Choose between changing the background color via something like this.style.backgroundColor = "gray"; or add a dotted border via this.style.border = "1px dotted invert". In the dotted border case, you will need to make sure those elements have an invisible 1px border to start with, so that the element doesn't grow when the border style is applied (borders take up space, and IE doesn't implement CSS outlines). </p>
</li><li>
<p><em>Prevent used key events from performing browser functions</em> - If a key such as an arrow key is used, prevent the browser from using the key to do something (such as scrolling) by using code like the following:</p>
<pre class="example" xml:space="preserve"><span class="tag"><span tabindex=<span class="str">"-1"</span> onkeypress=<span class="str">"return handleKeyPress();"</span>></span> </pre>
<p>If handleKeyDown() returns false, the event will be consumed, preventing the browser from performing any action based on the keystroke. In addition to the return value the browser must call the event methods that will prevent the default action, for IE this is setting the event property "returnValue=false", and for other browsers supporting the W3C event model this means calling the "preventDefault" method of the event object.</p>
</li><li>
<pre class="example" xml:space="preserve"><span class="tag"><span tabindex=<span class="str">"-1"</span> onkeydown=<span class="str">"return handleKeyDown();"</span>></span> </pre>
<p>If handleKeyDown() returns false, the event will be consumed, preventing the browser from performing any action based on the keystroke. </p>
</li><li>
<p><em>Use key event handlers to enable activation of the element</em> - For every mouse event handler, a keyboard event handler is required. For example, if you have an <em>onclick="doSomething()"</em> you may also need <em>onkeydown="return event.keyCode != 13 || doSomething();" </em>in order to allow the Enter key to activate that element. </p>
<p class="note">Note: There are <a href="http://wiki.codetalks.org/wiki/index.php/Docs/Keyboard_navigable_JS_widgets">user agent-specific considerations</a> for key event handling.</p>
</li><li>
<p>Consider using a "<a href="#kbd_general_within">roving</a>" tabindex for complex widgets if you are not using the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> property. </p>
</li></ul>
</div>
<div class="section" id="focus_activedescendant">
<h4><span class="tocnum">3.2.2. </span> Using activedescendant to Manage Focus for Widget Children</h4>
<p>In addition to tabindex, WAI-ARIA provides the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> property for managing the focus of child elements within a widget. Widgets like <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#grid"><code>grid</code></a> and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tree"><code>tree</code></a> typically manage their children. The root element of the widget should have a <code>tabindex</code> value greater than or equal to "0" to ensure that the widget is in the document tabbing order. Rather than setting a key event handler on each element within a larger component, the event handler can be set on the parent element such as the tree. It is then the job of the parent element to manage the focus of the children. </p>
<p> The parent may use the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> property to indicate the active child. For example, the container element with the role of tree can provide an onkeydown event handler so that each individual tree item within the tree does not need to be focusable and to listen for the keydown event. The container object, in this case the tree, needs to maintain the point of regard and manage which individual child item must be perceived as active.</p>
<div class="note">
<p><em>Important: For a given container widget where activedescendant must cause focus events to be fired to ATs, the actual focus must be on the container widget itself. In HTML this is done by putting tabindex="0" on the container widget.</em></p>
</div>
<p>The key handler on the parent captures the keystrokes and determines what item becomes active next and updates the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> property with the ID of the appropriate, next active child element. The browser takes that ID information and generates the focus event to the assistive technology. Each individual element does not have to be made focusable via a <code>tabindex</code> value of -1, but it must be styled using CSS to indicate the active status</p>
</div>
<div class="section" id="visualfocus">
<h4><span class="tocnum">3.2.3. </span> Managing Visual Focus with tabindex Alone </h4>
<p>An alternative to using activedescendant is to have the parent element, in response to the same keyboard input, move focus to its children by first removing <code>tabindex</code> from children that do not have focus, which removes them from the tab order. This would be followed by setting the <code>tabindex</code> to "-1" on the element that is to receive focus and then using script to set focus on the element to receive focus. As with <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a>, this omits managed children from the tabbing order. It enables browsers that do not yet support <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> to maintain keyboard navigation, and it provides notification to many assistive technologies like screen magnifiers to move visual focus without relying on other WAI-ARIA properties. Today, this technique will work in most user agents, but in the long run <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> will require less work by the developer.</p>
<p>Although not always ideal based on the widget you are creating, one benefit of using tabindex to manage focus on an element is that the user agent will scroll the element into view when focus is set to the it. This is not the case for <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a>. When setting or updating the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> property, e.g. <code>aria-activedescendant="cell23"</code>, authors must ensure that the element with <code>id="cell23"</code> is in view. In either case, consider positioning your widget in the visible area of your browser to maximize usability. This can be achieved using available JavaScript scrolling functions.</p>
</div>
<div class="section" id="scrollintoview">
<h4><span class="tocnum">3.2.4. </span> Managing Focus with Scroll</h4>
<p>In some browsers, a JavaScript call to <code> scrollIntoView()</code> on this element should suffice, but in browsers where this is unreliable, authors should explicitly set the <code>scrollTop</code> and <code>scrollLeft</code> properties of the "cell23" element and its ancestors to scroll the element into view. <code>scrollTop</code> and <code>scrollLeft</code> adjust the node positions by the amounts(pixels) needed to scroll a node into view. Scrolling values are adjusted by the amounts(pixels) needed
to scroll a node into view. This is done by comparing the sizes of the nodes
using available measurements such as scroll+offset+clientWidth/Height/Left/Top. It's important to note that you have to adjust a node so that it's viewable within
the context of its parent node. Then you have to move up the DOM tree and make
each parent node visible.</p>
<p>For example, create a custom <code> scrollIntoView()</code> method that is called at various times, including coincidence with the setting of the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> property. The method takes a DOM node argument, say "n". Here is the high level algorithm: </p>
<ol><li> If n is already in view, stop; otherwise, continue. </li><li> adjust n.scrollTop and n.scrollLeft such that it is in view. </li><li>adjust scrollTop and scrollLeft for the ancestor nodes of n such that that the region of the ancestors which n consumes is visible.</li></ol>
<p>This is a minimum-position-change algorithm. </p>
<p>Understanding how the DOM scrollIntoView works across browsers is important.
Browsers (including Firefox3) force the node either to the top or the bottom of the screen (as defined by the single Boolean parameter) even if its already in view. This is problematic when you only need to scroll horizontally to see the element. It is also problematic when the node is partially off the bottom of the screen and the parameter is (true) which forces the node all the way to the top, and vice versa with the top going to the bottom on (false). IE forces the node to the left of the client area (or right in right-to-left mode) even if it's horizontally in view already. </p>
<p>The <code>scrollTop</code> and<code> scrollLeft</code> functions create some challenges. <code>scrollTop</code> is always accurate but misleading with respect to inner (nested) scrollbars.<code> scrollLeft</code> cannot be relied on in right-to-left languages because it is sometimes negative and sometimes positive especially with respect to inner (nested) scrollbars. Different browsers handle right-to-left completely differently. </p>
</div>
<div class="section" id="dualfocus">
<h4><span class="tocnum">3.2.5. </span> Managing the Perception of a Dual Focus</h4>
<p>Often applications give the perception of having a dual focus. Two examples of this are multi-selection list boxes and selected tabs, within a tablist, when focus is in a tabpanel. In the case of a muti-selection list box a developer may gray selected items as they move focus to list box items to toggle their selected state. In the case of a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tabpanel"><code>tabpanel</code></a> the user selects a tab but then navigates to a focused item in the corresponding <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tabpanel"><code>tabpanel</code></a> the tab appears to also have focus. In reality, only one element may have focus in an application. In these scenarios authors should ensure keyboard focus is set on the current element that visibly receives keyboard user input while ensuring other "highlighted" elements have an aria-selected state of "true" until de-selected. When the de-selection occurs, such as when a multi-select item is de-selected or a user moves to a new tab and de-select the old tab, the author should ensure that the visible selection of the de-selected item is removed.</p>
</div>
<div class="section" id="AuthDefKeys">
<h4><span class="tocnum">3.2.6. </span> Author-Defined Keyboard Short-Cuts or Mnemonics </h4>
<p>Author-defined keyboard short-cuts or mnemonics present a high risk for assistive technology users. Because they are device-, browser-, and AT-dependent, conflicts among key bindings are highly probable. Therefore, if you needed to use <a href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#h-17.11.2">accesskey</a>, you should be aware that it will behave differently in <br clear="none"/>
different browsers. It also may not work with small devices so it is still advisable to ensure that all features are accessible with the basic keys like Tab/shift+tab, arrow, Enter, space and Escape. </p>
<p>The XHTML 2 Working Group is currently developing a new <a href="http://www.w3.org/TR/xhtml-access/">Access Module</a> to address this issue and we hope to have it or a feature like it in future versions of (X)HTML. Refer to <a href="#aria_ex">Section 9: Implementation Guidance</a>. </p>
<div class="section" id="kbd_tooltips">
<h5><span class="tocnum">3.2.6.1. </span> Supporting Tooltips with the Keyboard</h5>
<p>A <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tooltip"><code>tooltip</code></a> is a popup messages typically triggered by moving a mouse over a control or widget causing a small popup window to appear with additional information about the control. To provide simple text tooltips, the <a href="http://www.w3.org/TR/1999/REC-html401-19991224/struct/global.html#h-7.4.3">HTML title attribute</a> should more than suffice because the user agent will render it for tooltips. When creating a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tooltip"><code>tooltip</code></a>, it is essential that the user be able to activate it using the keyboard. When a form control or widget receives keyboard focus, the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tooltip"><code>tooltip</code></a> must display. When the form control or widget loses focus, the tooltip must disappear. Browsers do not currently support this functionality. </p>
<p>The following code snippet from the <a href="http://test.cita.uiuc.edu/aria/tooltip/tooltip1.php" title="iCITA"><acronym title="Illinois Center for Information Technology Accessibility">iCITA</acronym></a> site shows the use of a <span class="example">onfocus="tooltipShow()</span> function to display the tooltip when focus is placed on an element. </p>
<pre class="example" id="line1" xml:space="preserve"><span class="tag"><html lang=<span class="str">"en-us"</span>"></span>
<span class="tag"><head></span>
<span class="tag"><title></span>inline: Tooltip Example 1<span class="tag"></title></span>
<span class="tag"><link rel=<span class="str">"stylesheet"</span> href=<span class="str">"css/tooltip1_inline.css"</span> type=<span class="str">"text/css"</span>></span>
<span class="tag"><script type=<span class="str">"text/javascript"</span> src=<span class="str">"js/tooltip1_inline.js"</span>></span><span class="tag"></script></span>
<span class="tag"><script type=<span class="str">"text/javascript"</span> src=<span class="str">"../js/widgets_inline.js"</span>></span><span class="tag"></script></span>
<span class="tag"><script type=<span class="str">"text/javascript"</span> src=<span class="str">"../js/globals.js"</span>></span><span class="tag"></script></span>
<span class="tag"><link rel=<span class="str">"icon"</span> href=<span class="str">"http://www.cites.uiuc.edu/favicon.ico"</span> type=<span class="str">"image/x-icon"</span>></span>
<span class="tag"><link rel=<span class="str">"shortcut icon"</span> href=<span class="str">"http://www.cites.uiuc.edu/favicon.ico"</span> type=<span class="str">"image/x-icon"</span>></span>
<span class="tag"></head></span>
...
<span class="tag"><body onload=<span class="str">"initApp()"</span>></span>
<span class="tag"><div id=<span class="str">"container"</span>></span>
<span class="tag"><h1></span>Tooltip Example 1<span class="tag"></h1></span>
<span class="tag"><h2></span>Create Account<span class="tag"></h2></span>
<span class="tag"><div class=<span class="str">"text"</span>></span>
<span class="tag"><label for=<span class="str">"first"</span>></span>First Name:<span class="tag"></label></span>
<span class="tag"><input type=<span class="str">"text"</span> id=<span class="str">"first"</span> name=<span class="str">"first"</span> size=<span class="str">"20"</span>
onmouseover=<span class="str">"tooltipShow(event, this, 'tp1');"</span>
onfocus=<span class="str">"tooltipShow(event, this, 'tp1');"</span>
aria-describedby=<span class="str">"tp1"</span>
aria-required=<span class="str">"false"</span>/></span>
<span class="tag"><div id=<span class="str">"tp1"</span> role=<span class="str">"tooltip"</span> aria-hidden=<span class="str">"true"</span>></span>Your first name is optional. <span class="tag"></div></span>
<span class="tag"></div></span>
...
</pre>
</div>
<div class="section" id="kbd_stolen_keys">
<h5><span class="tocnum">3.2.6.2. </span> When Keyboard Handlers Shortcuts Steal the Keys</h5>
<p>
Similar to the tip specified in <a href="#focus_tabindex">Using Tabindex to Manage Focus on Widgets</a>, a web application should cancel (or swallow) the keyboard event in the keyboard handler to prevent the key from being used outside the web application. For example if the user presses Control+PageDown in a tab panel in a web application, this keyboard event should not also go to the user agent, which would cycle the active browser tab, confusing the user.
</p>
</div>
</div>
<div class="section" id="kbd_layout">
<h4><span class="tocnum">3.2.7. </span> Providing Navigable Structure within Web Pages</h4>
<p>This section takes a broader look at the Web page. It is intended to assist you in conveying a logical, usable, and accessible layout to an assistive technology or adaptive system designed to modify the visual layout to meet the users needs. </p>
<p>One of the deficiencies of (X)HTML for disabled users has been the usability of keyboard navigation. Users dependent on a keyboard for navigation have been forced to tab everywhere in the document, as the only keyboard accessible document elements are form and anchor elements. This has forced developers to make most everything a link to make it keyboard accessible, and to get to each link you have to tab to it. With the advent of portals and other content aggregation means Web pages are divided into visible regions and there has been no vehicle to get to them other than perhaps to do things such as: </p>
<ul><li>Create a skip link at the top of the page to the main content </li><li>Make the head of each perceivable region (search bar, stock quote, TV Listing, etc.) an <code><H1></code> tag </li></ul>
<p>There are number of problems with this approach: </p>
<ul><li>Both force the user interface to change to support accessibility </li><li>In the case of using <code><H1></code> to mark your regions, this is not consistent across Web sites </li><li>The semantics are limited to main content and a section</li><li>Neither convey the need for the rich internet application developer to control keyboard navigation to an assistive technology</li></ul>
<p>This remainder of this section provides the author with a playbook for using WAI-ARIA to add semantically rich navigation structure in a Web page so that an assistive technology may provide an effective user experience and avoid these shortcomings.</p>
<div class="section" id="kbd_layout_landmarks">
<h5><span class="tocnum">3.2.7.1. </span> Steps for Defining a Logical Navigational Structure</h5>
<p>Follow these steps to mark each logical section: </p>
<ol><li>
<p><a id="kbd_layout_landmark_IDRegions" name="kbd_layout_landmark_IDRegions"></a><strong>Identify the logical structure of your page</strong></p>
<p>Break up your page into perceivable block areas which contain semantically associated information called "regions". You can further break down each region into logical regions as needed. This is a common process undertaken by portal developers who break the page into perceivable regions called portlets. Think about the user wanting to navigate to these logical block areas on your Web page. Write down a description of what you believe each region to be.</p>
<p> Depending on your Web application you may then need to break it into sub regions depending on the complexity of your Web application. This is a recursive process. A user will look at these perceivable areas like pealing an onion. You might have an outermost collection of perceivable regions or block areas and upon entering each region you may have a collection of regions within it. </p>
</li><li>
<p><a id="KBD_logicalstructuremarkup" name="KBD_logicalstructuremarkup"></a><strong>Implement the logical structure in markup</strong></p>
<p>Implementing the block structure in markup often involves wrapping elements contained with a "region" such as a <code><div></code> or <code><iframe></code> with visible borders so that each region or block is perceivable to the user.</p>
</li><li>
<p><a id="KBD_layout_labelregion" name="KBD_layout_labelregion"></a><strong>Label each region</strong></p>
<p> Once you have broken up each region you need to label it. The start of each region must have a perceivable header and it should be used to label the region. For details on how to do this see section <a href="#kbd_layout_nesting_vs_level">3.4.3.1 Header Levels vs. nesting level</a> to create a header to label each region. If you're finding it difficult to come up with a label for the region, make sure at least to use one of the standard roles defined in the following step. The drawback of not providing a label is that users will not know the purpose of the region. By definition, regions would be included in a summary of a page. If an assistive technology were to summarize it would be unable to provide information about the section without a label.</p>
</li><li>
<p><a id="kbd_layout_landmark_XHTML" name="kbd_layout_landmark_XHTML"></a><strong>Assign landmark roles to each region</strong></p>
<p>Now that you labeled your regions, you need to assign them semantic navigation landmarks. Landmarks are a vast improvement over the rudimentary "skip to main content" technique employed prior to WAI-ARIA. If possible it is best to use these as landmarks. Skip to main content links may impact the placement of web application elements. This may be a consideration for developers that want to try to keep their web application in a specific visible area. Consequently, layout adjustments may need to be made to support skip to main content links. Also, skip to main content links are limited in that they only address only one main content area. WAI-ARIA provides a collection of landmarks which are applied to each of the regions you identified in step 2. </p>
<p> The presence of common, semantic, navigation landmarks allows each site to support the same standard and allows your assistive technology to provide a consistent navigation experience - an important feature for screen readers and alternate input solutions. For users with cognitive and learning disabilities the landmark information could be used to expand and collapse these regions of your page to aid in simplifying the user experience by allowing the user to manage the amount of information processed at any one time. </p>
<p> There are also mainstream benefits of providing navigation landmarks. Your browser may assign key sequences to move focus to these sections as they can be set on every site. Navigation to these landmarks is device independent. A personal digital assistant (PDA) could assign a device key to get to them in your document. The common landmarks in WAI-ARIA include: </p>
<dl><dt><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#application"><code>application</code></a></dt><dd>
Represents a region of the page representing a unique software unit executing a set of tasks for its users. It is an area where assistive technologies should also return browse navigation keys back over to the web application in this region.
<p class="note">If the entire web page has a role of application then it should not be treated as a navigational landmark by an assistive technology.</p>
</dd><dt><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#banner"><code>banner</code></a> </dt><dd>A region that contains the prime heading or internal title of a page. </dd><dt><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#complementary"><code>complementary</code></a> </dt><dd>Any section of the document that supports but is separable from the main content, but is meaningful on its own even when separated from it. </dd><dt><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#contentinfo"><code>contentinfo</code></a> </dt><dd>Meta information which applies to the first immediate ancestor whose role is not presentation.</dd><dt><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#form"><code>form</code></a></dt><dd>A region of the document that represents a collection of form-associated elements, some of which can represent editable values that can be submitted to a server for processing.</dd><dt><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#main"><code>main</code></a> </dt><dd>Main content in a document. </dd><dt><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#navigation"><code>navigation</code></a> </dt><dd>A collection of links suitable for use when navigating the document or related documents.</dd><dt><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#search"><code>search</code></a> </dt><dd>The search tool of a Web document. </dd></dl>
<p>To set the landmark in your page: </p>
<pre class="example" xml:space="preserve"><div role="log" title="chat log">
<div role="region" title="Game Statistics"> </pre>
</li><li><a id="kbd_layout_static" name="kbd_layout_static"></a><strong>For application landmarks with static prose</strong>
<p>
If you have a regional landmark of type application and static descriptive text is available, then on the application landmark, include an aria-describedby reference to associate the application and the static text as shown here:</p><pre xml:space="preserve"><span class="tag"><div role=<span class="str">"applicaton"</span> aria-labelledby=<span class="str">"calendar"</span> aria-describedby=<span class="str">"info"</span>></span>
<span class="tag"><h1 id=<span class="str">"calendar"</span>></span>Calendar<span class="tag"><h1></span>
<span class="tag"><p id=<span class="str">"info"</span>></span>
This calendar shows the game schedule for the Boston Red Sox.
<span class="tag"></p></span>
<span class="tag"><div role=<span class="str">"grid"</span>></span>
....
<span class="tag"></div></span></pre>
</li><li><a id="kbd_layout_landmark_rebel" name="kbd_layout_landmark_rebel"></a><strong>For landmarks unsuited to specialized region WAI-ARIA roles</strong>
<p>You can create custom regional landmarks by using a generic <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#region"><code>region</code></a>. While it is not essential to label these specialized regions with a header, you should provide a title to ensure that the region name is accessible to all users, just as you would the <a href="#kbd_layout_landmark_XHTML">standard regional landmarks</a>. See <a href="#kbd_layout_nesting_vs_level">Header levels versus Nesting levels</a> for directions on how to label the region.</p>
<pre class="example" xml:space="preserve"><div role="main"> ... <div role="region" title="weather">
</pre>
<p>Note: the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#region"><code>region</code></a> role is generic and should only be used when a more specific role is not applicable.</p>
</li><li>
<p><strong>Indicate to the assistive technology who controls the keyboard navigation</strong></p>
<p> Today's screen readers for the blind have been designed to give the user a "browsing" experience meaning the screen reader consumes a number of keys to aid in the browsing experience. For example, the "up" and "down" arrow keys are used to read the next and previous line of text on your Web page. Accessible rich internet applications will use these keys in an application to navigate within "widgets" like a <a href="#TreeView">Tree View</a>.</p>
<p> Assistive technologies must be able to identify widgets which implement WAI-ARIA and allow them use of the keyboard. However, if you have used numerous widgets to form an application you must set the role on the encompassing region to <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#application"><code>application</code></a>. Should you have regions which should be browsed as documents within the application region you should mark those regions with a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#document"><code>document</code></a> role as needed. See section <a href="#kbd_layout_impact">3.4.2 Structural Roles used to facilitate assistive technology navigation</a>. </p>
</li></ol>
</div>
<div class="section" id="kbd_layout_impact">
<h5><span class="tocnum">3.2.7.2. </span> Structural Roles that Facilitate Navigation with Assistive Technologies</h5>
While WAI-ARIA is designed to address many disabilities, this section is best described in terms of screen reader use. In desktop applications, screen readers typically treat widgets as discrete entities, reading and interacting with each widget one at a time. The user moves the point of focus from widget to widget using tab/shift tab, mnemonics, or accelerators, keyboard commands which are usually provided by the application or the operating system. We refer to this mode of interaction as "application mode."
<p>When viewing Web content however, screen readers often gather information about all the widgets in an area and present them in a document-like view which the user navigates using keyboard commands provided and controlled by the screen reader. Think of this mode as a virtual environment that presents Web content in a way that makes it convenient for adaptive technology users to navigate and read. This is sometimes called browse mode, or virtual mode. We refer to this as "document browse mode." </p>
<p>Because many screen readers provide document mode navigation support using single key mnemonics on the alpha-numeric keyboard, they may provide a third mode, called "forms mode," used to interact with form controls that are encountered in document mode. Behavior in forms mode is similar to that of application mode. The key feature of forms mode is that it can be toggled with document mode to make it easy to both interact with a specific widget, and read virtualized content of which the widget is a part. Since, as described above, a screen reader's perception of an area as either a document or an application greatly influences how the user reads and interacts with it, WAI-ARIA provides content authors a way to indicate whether their pages must be viewed as applications or documents by assistive technologies. </p>
<p>To set document or application mode follow these steps: </p>
<ol><li>
<p><a id="kbd_layout_impact_approle" name="kbd_layout_impact_approle"></a><strong>Set the Application Role</strong></p>
<p>After you have divided your Web page into regions through the use of role landmarks and custom regions, you must make a decision: Is your Web page an application or not? If the majority of the content is application-like the default interaction mode should be set to <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#application"><code>application</code></a>, with <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#document"><code>document</code></a> regions embedded within the application if applicable. Otherwise the default interaction mode is document-like and therefore should not be overridden by the use of a global role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#application"><code>application</code></a>. In this case the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#application"><code>application</code></a> role can be placed on discrete regions within the document if applicable. </p>
<p>If it is, set the role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#application"><code>application</code></a> on the body tag as follows: </p>
<pre class="example" xml:space="preserve"><body role="application"> </pre>
<p> When using <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#application"><code>application</code></a>, all static text must be associated with widgets, groups or panes via using the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> properties, otherwise it will not be read by the screen reader when the user navigates to the related widget or group.</p>
<p>Special Considerations: </p>
<ul><li>If you have selected to have a role of application on the body tag, it is recommended that a widget have focus after the page is first loaded. There may be an instance when an application itself needs to receive focus, such as an application consisting solely of a scrollable editable text area. </li><li>If when your page loads and you should have focus on a widget this is a strong indicator that your Web page should have role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#application"><code>application</code></a>.</li><li>If your page has only a few isolated widgets, like pop-up calendars located on a Web page, it is not necessary to expressly set the role of application on the body. Screen readers, based on widget roles, must be able to provide access to these widgets without recognizing the entire page as an application. </li><li>Also, browsers make use of a feature called the contenteditable attribute, which will be incorporated into HTML 5. Contenteditable allows an author to turn the browser section into a rich text editor, similar to a word processor. Any section which has contenteditable set to "true" is considered a widget. </li><li>If the body element has been given the role of application, please follow step 3. Otherwise, the Web page is considered a document, and no further action is required in this regard. </li></ul>
</li><li><strong>Dialogs and alert dialogs - special case application roles</strong>
<p> WAI-ARIA provides <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#dialog"><code>dialog</code></a> and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#alertdialog"><code>alertdialog</code></a> roles that are to be treated as special case <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#application"><code>application</code></a> roles. Like application, screen readers will leave the main job of keyboard navigation up the dialog. </p>
<p> When using <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#dialog"><code>dialog</code></a>, all static text must be associated with widgets, groups or panes using the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> properties, otherwise it will not be read by the screen reader when the user navigates to the related widget or group. Unlike an application, your Web page is unlikely to start out as either of these two roles but rather the author is most likely to dynamically create dialogs or alertdialog sections within the Web page.</p>
<p> Unlike <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#dialog"><code>dialog</code></a>, descriptive text of the alert does not need to be associated via a relationship, as the contents of alert dialogs will be read automatically by the screen reader when the dialog opens. </p>
</li><li><strong>Set the document role</strong> </li></ol>
<blockquote>
<p>The default mode for a screen reader to be processing an HTML Web page is document browse mode. This is equivalent to having a role of document on the HTML <code><body></code> tag. If you have already specified a role of application on the body tag there may be times in which you tell the screen reader to switch into "document browse mode" and start stealing the necessary keys to browse a document section of your Web page. These keys are the typical keys used by WAI-ARIA widgets and to provide this level of navigation the keys must be stolen from your browser. </p>
<p>To mark areas of your page to tell the assistive technology when to switch into document browse mode, look at the regions/landmarks you have defined and determine which ones must be browsed as a document or navigated as an application. For each region which must be browsed in document browse mode, embed a div element within it with the role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#document"><code>document</code></a> as follows: </p>
<pre class="example" xml:space="preserve"><div role="document"> </pre>
<p>Now, when a screen reader encounters this region, it will change its interaction model to that of document browsing mode. </p>
</blockquote>
</div>
<div class="section" id="kbd_layout_nesting">
<h5><span class="tocnum">3.2.7.3. </span> Implicit Nesting and Headings </h5>
<p>This section discusses the use of the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#heading"><code>heading</code></a> role and nesting levels. </p>
<div class="section" id="kbd_layout_nesting_vs_level">
<h6><span class="tocnum">3.2.7.3.1. </span> Header Levels Versus Nesting Levels </h6>
<p>The <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#heading"><code>heading</code></a> role value signifies a heading for a section of the document instance. Use of the heading role indicates that a specific object serves as a header. The <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#region"><code>region</code></a> of the document to which the heading pertains to should be marked with the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> property containing the value of the id for the header. If you have a heading and there is no element containing the content that it heads, wrap the content in a <div> bearing this <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> attribute. If headings are organized into a logical outline, the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-level"><code>aria-level</code></a> property can be used to indicate the nesting level. Here is an example:</p>
<pre class="example" xml:space="preserve"><p role="main" aria-labelledby="hdr1">
<div role="header" id="hdr1" aria-level="1">
Top News Stories
</div>
</p></pre>
</div>
<div class="section" id="kbd_layout_nesting_owns">
<h6><span class="tocnum">3.2.7.3.2. </span> Owns Repairs Nesting</h6>
<p>Assistive technology briefs users on the context where they are. When they arrive at a new page, a page summary may be given. When they move into a new context, some of the labeling from elements containing the new focus or reading location may be rendered by the assistive technology, to give context to the details to be read next. </p>
<p>The syntactic structure of a page provides the default nesting of contexts. If a paragraph is nested in a <div> or table cell, it is assumed that labels for the <div> or headers for the table cell are pertinent to what is in the paragraph. On the other hand, it is not possible to always flow the logical structure one-to-one into the parse structure. </p>
<p>The <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> relationship is provided to annotate logical nesting where the logical child is not a syntactic descendant of the logical parent. In a Rich Internet Application, updates may be made to the document without updating the logical syntactic structure, yet elements may appear to be added to the document structure. From a DOM and accessibility hierarchy perspective <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> is a fallback mechanism to using the tree hierarchy provided in the DOM. An example of where <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> is needed is a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#treeitem"><code>treeitem</code></a>, where children in a folder subtree are added to a visible subtree but not reflected in the actual document subtree of the folder. The <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> relationship can be used to associate the folder with the new "adopted" child. For more details on the use of <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> see <a href="#relations_owning">section 4.2 Owning and Controlling</a>. The <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> relationship is used to indicate to a user agent that a menu is an adopting parent of a sub <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menu"><code>menu</code></a>. Another use for <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> is a hierarchical diagram where the child nodes of the diagram are not be adequately represented using the DOM structure. </p>
</div>
</div>
<div class="section" id="kbd_layout_groupheading">
<h5><span class="tocnum">3.2.7.4. </span> Directories, Groups, and Regions</h5>
<p>There are several WAI-ARIA roles used to indicate a collection of user interface objects, and each has a distinct purpose:</p>
<dl><dt> <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#directory"><code>directory</code></a> </dt><dd>Contains a static table of contents </dd><dt><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#group"><code>group</code></a></dt><dd>Small set of related user interface objects that would not be included in a page summary or table of contents by an assistive technology</dd><dt><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#region"><code>region</code></a></dt><dd>Section of related user interface objects that should be included in a page summary or table of contents. </dd></dl>
<p>The use of each is described below. </p>
<div class="section" id="kbd_layout_directories">
<h6><span class="tocnum">3.2.7.4.1. </span> Directories and Their Applicability </h6>
<p>The WAI-ARIA role, <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#directory"><code>directory</code></a>, allows authors to mark static table of content sections of a document. Prior to WAI-ARIA, the user would need to guess if an area of a document actually pertained to the table of contents. Authors should mark these sections within a document with a role of directory.</p>
<pre class="example" xml:space="preserve"><div role="directory">
<ul>
<li>Global Warming Causes
<ul>
<li>CO2 Buildup</li>
<li>Auto emissions<li>
<li>Factory emissions</li>
<li>Destruction of rainforests</li>
</ul>
</li>
<li>Tailoring CO2 buildup
<ul>
<li>Elimination of the incandescent light bulb</li>
<li>Hydrogen fuel cells</li>
<li>Solar energy</li>
<li>Wind power</li>
</ul>
</li>
</ul>
</div></pre>
</div>
<div class="section" id="kbd_layout_whatgroup">
<h6><span class="tocnum">3.2.7.4.2. </span> Groups and Their Applicability </h6>
<p>Authors should use a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#group"><code>group</code></a> to form logical collections of items with related functionality in a widget. A group should not be considered a major perceivable section on a page. A <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#group"><code>group</code></a> neither has a heading nor appears in the "Table of Contents." A <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#group"><code>group</code></a> may delineate a set of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#treeitem"><code>treeitem</code></a>s having the same level in the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tree"><code>tree</code></a> or it may be used to group a set of related checkboxes in a form. Other examples include: </p>
<ul><li>a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#row"><code>row</code></a> in a grid (a row is a specialized group representing a row in a grid); </li><li>a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#group"><code>group</code></a> of children in a tree widget forming a collection of siblings in a hierarchy; or </li><li>a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#group"><code>group</code></a> of items having the same container in a directory </li></ul>
<p>Proper handling of a group by assistive technologies, therefore, is determined by the context in which it is provided. Group members that are outside the DOM subtree of the group need to have explicit relationships assigned for them in order to participate in the group. Groups may also be nested. </p>
<p>If an author believes that a section is significant enough in terms of the entire document instance, then the author must assign the section a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#region"><code>region</code></a> or one of the designated standard landmarks. The designated landmark roles are listed in the section <a href="#kbd_layout_landmarks">Regions and XHTML Role landmarks</a>..</p>
</div>
<div class="section" id="kbd_layout_whatregion">
<h6><span class="tocnum">3.2.7.4.3. </span> Regions and Their Use </h6>
<p>When defining a region for a section of a document, authors must consider using standard document landmark roles defined in the <a href="http://www.w3.org/1999/xhtml/vocab/">XHTML Vocabulary</a>. This makes it possible for user agents and assistive technologies to treat roles as standard navigation landmarks. If the definition of these regions is inadequate, authors must use the WAI-ARIA <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#region"><code>region</code></a> role and provide the appropriate title text. </p>
<p>For more information on the use of region see <a href="#kbd_layout_landmarks">Regions and XHTML Role landmarks</a>.</p>
<p> </p>
</div>
</div>
<div class="section" id="kbd_layout_remaining">
<h5><span class="tocnum">3.2.7.5. </span> Remaining Structural Roles</h5>
<ul><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#columnheader"><code>columnheader</code></a> </li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#directory"><code>directory</code></a></li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#grid"><code>grid</code></a> </li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#gridcell"><code>gridcell</code></a></li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#img"><code>img</code></a> </li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#list"><code>list</code></a> </li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listitem"><code>listitem</code></a></li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#row"><code>row</code></a> </li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#rowheader"><code>rowheader</code></a></li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#separator"><code>separator</code></a> </li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#treegrid"><code>treegrid</code></a></li></ul>
<div class="section" id="kbd_layout_remaining_tabular">
<h6><span class="tocnum">3.2.7.5.1. </span> Tabular Structure-Related Roles Supporting Tabular Widgets</h6>
<p>A number of structural roles support the tabular widgets, <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#grid"><code>grid</code></a> and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#treegrid"><code>treegrid</code></a>. These structural roles indicate additional keyboard navigation as well as the ability to select rows and/or columns. Typically, you would apply these roles to an underlying table in the base markup as shown here:</p>
<pre class="example" xml:space="preserve"><table role="grid"> </pre>
<p>However, that may not work for the developer in all instances, such as when the developer has need for a <div> or <span> or when additional semantics are needed. To assist, the following roles are provided to support tabular widgets:</p>
<ul><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#columnheader"><code>columnheader</code></a> </li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#grid"><code>grid</code></a> </li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#gridcell"><code>gridcell</code></a></li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#row"><code>row</code></a> </li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#rowheader"><code>rowheader</code></a></li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#treegrid"><code>treegrid</code></a></li></ul>
<p>When constructing a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#grid"><code>grid</code></a>or <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#treegrid"><code>treegrid</code></a> the author must use <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#gridcell"><code>gridcell</code></a>s for the actual cells:</p>
<pre class="example" xml:space="preserve"><table role="grid">
<tr>
<td role= "columnheader">Apples</td><td role= "columnheader">Oranges</td>
</tr>
<tr>
<td role="gridcell">Macintosh</td><td role="gridcell">Valencia</td>
</tr>
</table></pre>
<p>Unlike table cells within a table, authors should ensure a grid's <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#gridcell"><code>gridcell</code></a>s are focusable through the use of tabindex (in HTML), or <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a> on the grid.They may also be editable, as is shown in the above example. </p>
<p>Treegrid's may require expanding and collapsing rows which may not be performed using a <tr>. In these instances authors will use an HTML <code><div></code>. WAI-ARIA provides a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#row"><code>row</code></a> which may be assigned to the <code><div></code> to convey to the assistive technology that this is still a row. If you decide to not use the native HTML <table> elements and choose more flexible elements, such as <code><div></code> and <code><span></code>s, with applied WAI-ARIA roles in this section, you should structurally lay out your elements in line with what you would expect from HTML. All of your <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#rowheader"><code>rowheader</code></a>s should be in a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#row"><code>row</code></a> and your <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#gridcell"><code>gridcell</code></a>s should be children of each subsequent row in the same format as HTML for <code><td></code>s and <code><th></code>s within <code><tr></code>s.</p>
</div>
<div class="section" id="kbd_layout_remaining_description">
<h6><span class="tocnum">3.2.7.5.2. </span> Marking Descriptive Sections</h6>
<p>
A new feature of WAI-ARIA is the ability to associate descriptive text with a section, drawing, form element, picture, and so on using the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> property. This is unlike longdesc which typically required the author to create a separate file to describe a picture when it was preferred to have the descriptive text in prose as well so that it was readily available to all users. Yet, like longdesc descriptive text is treated separately from the short name you would typically provide using the title or alt attributes in HTML.
</p>
<pre class="example" xml:space="preserve"><img src="foo" alt="abbreviated name" aria-describedby="prose1">
<div id="prose1">
This prose in this div describes in detail the image foo.
</div></pre>
<p> This is the preferred vehicle for providing long descriptions for elements in your document.</p>
</div>
</div>
<div class="section" id="misc_xhtml2_roles">
<h5><span class="tocnum">3.2.7.6. </span> Miscellaneous XHTML Section Roles</h5>
<p>In order to be synchronized with the XHTML Role Attribute module, WAI-ARIA includes two XHTML roles which are neither landmarks or widgets of any kind. These roles were incorporated to replace standard elements found in host languages. These roles are <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#definition"><code>definition</code></a> and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#note"><code>note</code></a>. If either role has a corresponding element in the host language it recommended that authors use the corresponding element in the host language.</p>
<p>The <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#definition"><code>definition</code></a> role indicates a definition statement in your document. For HTML developers implementing lists of definitions, we recommend you using the DL, DT, and DD elements rather than marking an arbitrary element with a role of definition. An arbitrary element would be appropriate for inline definitions used in conjunction with the DFN element. </p>
<p>Example of an inline definition with an explicit labelledby relationship:</p>
<pre class="example" xml:space="preserve">
<p>The doctor explained it had been a <dfn id="placebo">placebo</dfn>, or <span role="definition" aria-labelledby"placebo">
or an inert preparation prescribed more for the mental relief of the patient than for its actual effect on a disorder.</span>
</p></pre>
<p><span class="example">Example inline definition with an implicit labelledby relationship determined by nesting:</span></p>
<pre class="example" xml:space="preserve"><p>The doctor explained it had been a <span role="definition">
<dfn>placebo</dfn>, an inert preparation prescribed more for the mental relief of the patient than for its actual effect on a disorder.</span>
</p></pre>
<p>Note: In the case where host language semantics do not allow for implicit nesting of definitions terms inside definition roles, authors should explicitly use the aria-labelledby attribute, even when the definition term is nested in the definition as shown here:</p>
<pre class="example" xml:space="preserve"><p>The doctor explained it had been a <span role="definition" aria-labelledby="placebo">
<dfn id="placebo">placebo</dfn>, an inert preparation prescribed more for the mental relief of the patient than for its actual effect on a disorder.</span>
</p></pre>
<p>The following is an example using a definition list:</p>
<pre class="example" xml:space="preserve"><dl>
<dt id="anathema">anthema</dt>
<dd role="definition" aria-labelledby="anathema">a ban or curse solemnly pronounced by ecclesiastical authority and accompanied by
excommunication</dd>
<dd role="definition" aria-labelledby="anathema">a vigorous denunciation : cursor</dd>
<dt id="homily>homily</dt>
<dd role="definition" aria-labelledby="homily">a usually short sermon</dd>
<dd role="definition" aria-labelledby="homily">a lecture or discourse on or of a moral theme</dd>
</dl></pre>
<p>The <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#note"><code>note</code></a> role defines a parenthetic or ancillary remark to the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#main"><code>main</code></a> content of the resource. It also allows assistive technologies to skip over this section of the document unless more information is requested about the main content.</p>
<pre class="example" xml:space="preserve"><div role="main" aria-labelledby="foo">
<h1 id="foo">Wild fires spread across the San Diego Hills</h1>
Strong winds expand fires ignited by high temperatures ...
</div>
<div role="note">
This article was last updated July 30, 2008 at 6:05PM.
</div></pre>
</div>
</div>
</div>
<div class="section" id="modal_dialog">
<h3 id="make_modal"><span class="tocnum">3.3. </span> Making a Dialog Modal</h3>
<p>
WAI-ARIA provides for two dialog roles - dialog and alertdialog. When authors simulate dialogs on a web page they often limit their interaction considerations to the mouse. Unlike Graphical User Interface dialog boxes on a desktop computer, a user during keyboard navigation could accidentally navigate outside the dialog box and become disoriented. This can happen when the user is tabbing in the dialog. A modal dialog prevents the user from setting focus outside of the dialog until the dialog is closed. Mouse clicks outside of the dialog must be ignored and the user must not be able to tab into or out of the dialog itself. All WAI-ARIA enabled dialog boxes should be modal. This section describes how.
</p>
<p>
Mouse clicks outside of the dialog can be prevented by creating a CSS positioned element that is the size of the viewport to append as a child of the body element. Set the CSS z-index of this element so that it is above all other elements on the page except for the dialog element. Set the tabindex of the underlay element to tabindex="-1" to prevent it from receiving focus via a keyboard event or mouse click. You may lower the opacity of the underlay element in order to emphasize that the dialog itself is modal and has focus.
</p>
<p>
Depending upon the action to be performed by the dialog, the object with focus before the dialog box is opened should be saved. This will allow restoring focus to this element when the dialog box is closed. When the dialog box is opened, focus should be set to the first tab focusable element within the dialog. If there is no tab focusable element within the dialog box contents, set the focus to the item that is used to cancel or close the dialog. There must be some element within the dialog which can accept focus in order for the screen reader to speak the dialog title and information when it is opened. In order to prevent keyboard focus from leaving the dialog, determine the first and last tab focusable elements in the dialog and trap keyboard events within the document.
</p>
<p>
Search the contents of the dialog container to find the first and last tab focusable elements. This can be implemented by walking the DOM tree of the dialog container to find all visible and enabled anchor elements, input elements, and all elements that have a tabindex value greater than or equal to 0. Remember that elements with a tabindex > 0 will appear in the tab order before all other focusable elements in ascending order by tabindex. Store the first and last tab focusable items within variables in the scope of the dialog box code.
</p>
<p>
Before the dialog is shown, create and display the dialog underlay. Connect an onkeypress event handler to the DOM document.documentElement. This will catch all keystrokes on the document and allow trapping keyboard focus within the dialog. Size and position the dialog box in the viewport above the underlay, make it visible and set focus to the first tab focusable item in the dialog box.
</p>
<div class="section" id="trap_focus_div">
<h4 id="trap_focus"><span class="tocnum">3.3.1. </span> Trapping Focus</h4>
<p>
The onkeypress handler will catch all key presses within the document. This onkeypress event handler should be within the scope of the dialog box code so that it has access to the first and last tab focusable elements within the dialog. In the onkeypress handler determine the target of the keypress event. In addition, determine if there is only a single focusable item within the dialog box. In this instance the first tab navigable object will equal the last tab navigable object. If key presses within the dialog box may create, destroy, enable, disable, or change the visibility of tab focusable elements, then determine the first and last tab-focusable items each time a keypress is received. Based on the event target and the key pressed take the following actions:
</p>
<ul><li>
If the keypress is a <kbd>Shift+Tab</kbd> key and the target == the first tab navigable object, then set focus to the last tab-navigable object and stop the key press event. If there is only a single tab focusable item, then focus does not have to be set, but the key press event must be stopped.
</li><li>
If the keypress is a <kbd>Tab</kbd> key and the target == the last tab navigable object, then set focus to the first tab-navigable object and stop the keypress event. If there is only a single tab-focusable item, then focus does not have to be set but the keypress event must must be stopped.
</li><li>
If the keypress is an <kbd>Esc</kbd> key and the target node is the container node for the dialog box, then close the dialog box and hide or destroy the dialog underlay.
</li></ul>
<p>
Determine if the target node of the keypress is within the dialog box container. This can be done using a while loop to walk the parent chain of the target node until the container node of the dialog box is found. Other than those outlined above, all key presses from within the dialog box should be allowed to execute so that the user can interact with the controls in the dialog box.
</p>
<p>
If the target node is not within the dialog box, the keypress is from the documentElement and the keypress event should be stopped unless it is a <kbd>Tab</kbd> key press. Allowing a <kbd>Tab</kbd> key press from the document element will enable tabbing back into the dialog box if, for some reason, focus on the dialog box is lost. This can happen due to timing issues when the dialog box is first loaded and focus does not properly get set to the first tab-focusable item within the dialog.
</p>
<p>
The dialog box itself should contain buttons or other mechanisms to cancel the dialog box or execute the dialog box functions and close the dialog box.
</p>
<p>
Here is a pseudo code onkeypress handler for a modal dialog box. Pseudo code is used to focus on the actions in the handler rather than on the differences in browser event handling. Assume that the event object, evt, has been normalized between browsers and the helper object is a library of functions that handle browser differences. The keys object is a set of key definition variables. Dialog is the dialog box object, which has a function to cancel the dialog.
</p>
<pre xml:space="preserve">
_onKey: function(/*Normalized Event*/ evt){
// summary:
// Handles the keyboard events for accessibility reasons
if(evt.charOrCode){
var node = evt.target; // get the target node of the keypress event
if (evt.charOrCode === keys.TAB){
// find the first and last tab focusable items in the hierarchy of the dialog container node
// do this every time if the items may be added / removed from the the dialog may change visibility or state
var focusItemsArray = helper.getFocusItems(dialogContainerNode);
dialog.firstFocusItem = focusItemsArray[0];
dialog.lastFocusItem = focusItemsArray[focusItemsArray.length-1];
}
// assumes firstFocusItem and lastFocusItem maintained by dialog object
var singleFocusItem = (dialog.firstFocusItem == dialog.lastFocusItem);
// see if we are shift-tabbing from first focusable item on dialog
if(node == dialog.firstFocusItem && evt.shiftKey && evt.charOrCode === keys.TAB){
if(!singleFocusItem){
dialog.lastFocusItem.focus(); // send focus to last item in dialog
}
helper.stopEvent(evt); //stop the tab keypress event
}
// see if we are tabbing from the last focusable item
else if(node == dialog.lastFocusItem && evt.charOrCode === keys.TAB && !evt.shiftKey){
if (!singleFocusItem){
dialog.firstFocusItem).focus(); // send focus to first item in dialog
}
helper.stopEvent(evt); //stop the tab keypress event
}
else{
// see if the key is for the dialog
while(node){
if(node == dialogContainerNode){ // if this is the container node of the dialog
if(evt.charOrCode == keys.ESCAPE){ // and the escape key was pressed
dialog.cancel(); // cancel the dialog
}else{
return; // just let it go
}
}
node = node.parentNode;
}
// this key is for the document window
if(evt.charOrCode !== keys.TAB){ // allow tabbing into the dialog
helper.stopEvent(evt); //stop the event if not a tab keypress
}
} // end of if evt.charOrCode
} // end of function
</pre>
</div>
</div>
</div>
<div class="section" id="relations">
<h2><span class="tocnum">4. </span> Relationships</h2>
<div class="section" id="relations_labeling">
<h3><span class="tocnum">4.1. </span> Labeling and Describing</h3>
<p>Marked up content or widgets will often need additional context to make clear what the meaning or purpose is. It is also reasonable that some content media types will need additional descriptions in another format to give clarity to those who are unable to consume the origin format. These additional meta-content sections are linked together by tagging them as labels or descriptions. WAI-ARIA provides the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> attributes to signal the browser to feed these relationships into the accessibility layer. This layer is then used by screen readers and other accessibility technology (AT) to gain awareness of how disparate regions are actually contextually connected to each other. With this awareness the AT can then present a meaningful navigation model for discovery and presentation of these additional content sections. The user agent itself can also choose to present these insights in a meaningful way. Generally you should always add these attributes to any widgets on your site as they are often merely a construct of HTML and JavaScript which provides no obvious insight as to what the widget's behavior or interactivity is. </p>
<div class="section" id="LabeledBy">
<h4><span class="tocnum">4.1.1. </span> Labeling</h4>
When using one element to label another use the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> by attribute. A label should provide the user with the essence of what the object does. For example, you could have a dialog box erected from HTML <code><div></code> and you need to assocate a label for the dialog. With a WAI-ARIA role of dialog, you can indicate its widget type and define a label using an HTML header and then associate that label with the dialog using the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> relationship.
<pre xml:space="preserve">
<div role="dialog" aria-labelledby="dialogheader">
<h2 id="dialogheader">Choose a File</h2>
... Dialog contents
</div>
</pre>
<p>The section doing the labeling might be referenced by multiple widgets or objects as these need only reference the same id, so contextual description may not always be viable. The labelledby attribute can have multiple ids specified as a space separated list much like applying multiple classes to a single DOM object.</p>
<p>It should be noted that (X)HTML provides a <<code><a href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#h-17.9">label for</a></code>> element which you can use to label form controls. For all visual objects, including (X)HTML form elements, you should use the WAI-ARIA <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> property for labeling. </p>
<div class="note">
<p class="note">Some elements receive their label for embedded text content, but that is the exception.</p>
</div>
</div>
<div class="section" id="Descriptions">
<h4><span class="tocnum">4.1.2. </span> Describing</h4>
<div class="section" id="Descriptions_describedby">
<h5><span class="tocnum">4.1.2.1. </span> Using aria-describedby</h5>
<p>When one element describes another, use the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> attribute. An <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> section provides further information about a given object or widget, which may not be intuitively obvious from the context, content or other attributes. For example, a fake window is a common widget used in Web applications and is often constructed using a div absolute positioned in a layer above other content. To simulate common window behavior look and feel there is often an X box in the corner which, when activated, dismisses the window widget. One common way to make this X box is to simply make a link whose content is an X. This doesn't give a non-visual user much to go on and belies the real purpose of the X link. To help we add more descriptive text stored elsewhere in the page like this: </p>
<pre class="example" xml:space="preserve"><span class="tag"><button aria-label=<span class="str">"Close"</span> aria-describedby=<span class="str">"descriptionClose"</span>
onclick=<span class="str">"myDialog.close()"</span>></span>X<span class="tag"></button></span></pre>
and then elsewhere in the HTML
<pre class="example" xml:space="preserve"><span class="tag"><div id=<span class="str">"descriptionClose"</span>></span>Closing this window will discard any information entered and
return you back to the main page<span class="tag"></div></span></pre>
Like labelledby, describedby can accept multiple ids to point to other regions of the page using a space separated list. It is also limited to ids for defining these sets. In our contrived example we would also want a good labelledby section to fully explain what the window does and how closing will effect the task being worked on. If an object or widget lacks describedby the user agent or AT may try to extract information from the label or th tags, if present. The label and th tags have limited use in that they can only be applied to forms or tables, respectively.
</div>
<div class="section" id="Descriptions_tooltip">
<h5><span class="tocnum">4.1.2.2. </span> Using a tooltip as a description</h5>
<p>WAI-ARIA also defines the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tooltip"><code>tooltip</code></a> role to which <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> may reference an author defined tooltip. The assistive technology can tell from the type of object describing the document element what the purpose of that element is. For example, a screen reader could announce the tooltip without the user having to waive the mouse over the element by following the describedby relationship to a document area with a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tooltip"><code>tooltip</code></a> role. The <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> property is also useful for describing <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#group"><code>group</code></a>s. </p>
<p>Here is a code snippet showing a set of the tooltip: </p>
<pre class="example" xml:space="preserve">...
<span class="tag"><div class=<span class="str">"text"</span>></span>
<span class="tag"><label for=<span class="str">"first"</span>></span>First Name:<span class="tag"></label></span>
<span class="tag"><input type=<span class="str">"text"</span>
id=<span class="str">"first"</span>
name=<span class="str">"first"</span>
size=<span class="str">"20"</span>
onfocus=<span class="str">"tooltipShow(tooltip1)"</span>
onblur=<span class="str">"tooltipHide(tooltip1)"</span>
onmouseover=<span class="str">"tooltipShow(tooltip1)"</span>
onmouseout=<span class="str">"tooltipHide(tooltip1)"</span>
aria-describedby=<span class="str">"tp1"</span>
/></span>
<span class="tag"><div id=<span class="str">"tp1"</span> class=<span class="str">"tooltip"</span> role=<span class="str">"tooltip"</span>></span>Your first name is optional<span class="tag"></div></span>
<span class="tag"></div></span>
... </pre>
</div>
<div class="section" id="Descriptions_external">
<h5><span class="tocnum">4.1.2.3. </span> Descriptions on external pages</h5>
<p>The <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> property is not designed to reference descriptions on an external resource—since it is an IDREF, it must reference an element in the same DOM document. This is different from the HTML longdesc attribute, which accepts any URI. In general, the preferred pattern for WAI-ARIA applications is to include all relevant resources in the same DOM, But if you wish to reference an external resource with <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a>, you can reference a link that in turn references the external resource. This requires the user to follow two steps, first following the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> arc, then following the link, but does address the use case. The following example demonstrates this:</p>
<pre class="example" xml:space="preserve"><span class="tag"><p></span>
<span class="tag"><img
src=<span class="str">"images/histogram.png"</span>
alt=<span class="str">"Histogram of Blackberry tree heights"</span>
width=<span class="str">"40%"</span>
aria-describedby=<span class="str">"longdesc1"</span>
/></span>
<span class="tag"></p></span>
<span class="tag"><p></span>
<span class="tag"><a id=<span class="str">"longdesc1"</span> href=<span class="str">"blackberry-description.html"</span> target=<span class="str">"_description"</span>></span>Data for Blackberry Histogram<span class="tag"></a></span>
<span class="tag"></p></span></pre>
</div>
</div>
</div>
<div class="section" id="relations_owning">
<h3><span class="tocnum">4.2. </span> Owning and Controlling</h3>
<p>Two relationships expand the logical structure of a WAI-ARIA Web application. These are <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a> . The <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> relationship completes the parent/child relationship when it cannot be completely determined from the DOM created from the parsing of the markup. The <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a> relationship defines a cause-and-effect relationship so that assistive technologies may navigate to content effected by and changes to the content where the user is operating. </p>
<div class="section" id="relations_owns">
<h4><span class="tocnum">4.2.1. </span> The Owns Relationship</h4>
<p>In addition to WAI-ARIA role and state information, for a document element,
an assistive technology needs to convey its context. In
the case of a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#treeitem"><code>treeitem</code></a>, it is important to know the parent (container),
which may provide a folder depth and the number of siblings in the folder. This containment hierarchy can often be determined by
the DOM tree, as it provides parent, siblings, and children for a given
document element. That said, the DOM hierarchy is rigid and acyclical in
that each node may only have one parent. In some situations, a child
is reused by multiple parents or a child is separated from its
sibilings or parent in the DOM tree. One example is when a radio button
appears in a table but it is not a DOM child of the radiogroup, due to the
authors use of a table for formatting and the placement of the radio buttons
placing them outside the radiogroup container. To solve this problem
WAI-ARIA provides the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> property.</p>
<p>
The <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> property is set on a document element, and its values are the
unique IDs of all the adopted children. These elements may appear anywhere
in the DOM, yet they are treated as siblings of each owning parent. This
example illustrates a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#radiogroup"><code>radiogroup</code></a> that first uses the DOM hierarchy to
convey context and then <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a>:</p>
<p>First, consider the preferred method for using the W3C DOM to describe the relationship between
<a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#radiogroup"><code>radiogroup</code></a> and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#radio"><code>radio</code></a> roles for HTML:</p>
<pre xml:space="preserve">
<div id="radio_label">My radio label</div>
<ul role="radiogroup" aria-labelledby="radio_label">
<li role="radio">Item #1</li>
<li role="radio">Item #2</li>
<li role="radio">Item #3</li>
</ul>
</pre>
<p>
In this example, the elements with <code>role="radio"</code> are child nodes of the parent <code>role="radiogroup"</code> element node.
</p>
<p>
Now, consider an alternative method using the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> property to describe the parent-child
role relationship between <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#radiogroup"><code>radiogroup</code></a> and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#radio"><code>radio</code></a> roles for HTML:</p>
<pre xml:space="preserve">
<table>
<tr>
<td role="radiogroup" aria-owns="myradio1 myradio2 myradio3" rowspan="3" >
My Radio Label
</td>
<td id="myradio1" role="radio">Item #1</td>
</tr>
<tr>
<td id="myradio2" role="radio">Item #2</td>
</tr>
<tr>
<td id="myradio3" role="radio">Item #3</td>
</tr>
</table>
</pre>
<p class="note">
The <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> property should be used sparingly, since it
increases the computational load on assistive technology to provide
alternative renderings. Also, when accessing the DOM and enumerating
children of a DOM node, an AT should then enumerate the adopted children
using the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> property. At that instance of walking the DOM, the
parent of the adopted children is the adopted parent and not the DOM
parent. This will avoid recursion problems.</p>
<p>
Each child, adopted or natural, should have the appropriate
<a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-posinset"><code>aria-posinset</code></a> and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-setsize"><code>aria-setsize</code></a> properties set consistent with their
rendering, if these cannot be determined from the DOM from a direct parsing of
the host language. Places where direct parsing does not allow the user
agent to determine
<a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-posinset"><code>aria-posinset</code></a> and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-setsize"><code>aria-setsize</code></a> are long lists where only
the currently visible items are loaded (via Ajax). If the children are
re-sorted then the
<a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-posinset"><code>aria-posinset</code></a> and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-setsize"><code>aria-setsize</code></a> values should be updated
consistent with their visual rendering. Rather than setting size only on a container, content authors should specify aria-setsize on each member of a set to avoid performance issues. If this property is not set, the user agent must compute and set the property on supporting roles.</p>
<p> Platform accessibility API mappings must invert this relationship for
assistive technologies, so that they may determine the owning parent from a
child and couple it with <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-posinset"><code>aria-posinset</code></a> and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-setsize"><code>aria-setsize</code></a> information to
provide context information to the user.</p>
</div>
<div class="section" id="relations_owns_reuse">
<h4><span class="tocnum">4.2.2. </span> Using Owns with Reusable Content</h4>
<p>If you are re-using content across different, transient sections of content by restyling it to render it in association with a different object, you need to maintain the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> property as well to match the current use and apparent ancestry of the reused sub-section. A good example of this is a context help menu that resides at the end of the document. When the user wishes to launch the context help menu in association with different visual elements, styling is used to render the menu in context with that object. Prior to rendering the visual submenu you should ensure the object to which you have requested help assigns its <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> property value to the submenu ID. When the menu closes you can remove the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> property. </p>
</div>
<div class="section" id="relations_controls">
<h4><span class="tocnum">4.2.3. </span> The Controls Relationship</h4>
<p>In rich internet applications document elements may control the behavior on another part of Web page outside themselves. The <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a> attribute indicates cause-and-effect relationships between document elements. </p>
<p>An example might be a group of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#radio"><code>radio</code></a> buttons that "control" contents of a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listbox"><code>listbox</code></a> in another part of the page. Here, you would want the radio group to assign a <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a> relationship to the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listbox"><code>listbox</code></a> which will be updating without a page reload. The user, through their assistive technology, can then navigate to the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listbox"><code>listbox</code></a> by following the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a> relationship when a different radio is selected, to see how the contents changed in the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listbox"><code>listbox</code></a>. The ability to update parts of a page without a page reload is a common practice of applications making use of Ajax. Without the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a> attribute, a user would be unable to effectively use these types of Web pages as assistive technologies often will not make the user aware of what is happening outside the context of the element the user is currently operating.</p>
<p>With the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a> attribute the user may use the assistive technology to follow the relationship to the object it is controlling. It is extremely important for an assistive technology to present changes in the document in response to user input. Therefore, an assistive technology immediately presents changes to a live region when the controlling widget is the one which has user keyboard focus. For example, if a tree view controls a help document pane, each time<br clear="none"/>
the tree item changes the new tree item and then the new help contents should also be read. In the case of a screen reader, the amount of information read in the target live region is dependent on <a href="#liveprops">how the live region is configured</a>. </p>
<p>The <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a> attribute takes one or more ids which refer to the document element. If this relationship is not implied by the host language semantics, then the controlling element must be given a controls attribute with the IDs of the other elements where the changes will show up listed in the attribute value.</p>
</div>
</div>
<div class="section" id="relations_flowto">
<h3><span class="tocnum">4.3. </span> Changing the Reading Flow</h3>
<p>(X)HTML suffers from a number of disadvantages in keyboard navigation today. One such example is the restriction of navigation to the tabbing order. This is a common problem with presentations in office suites where the logical, perceivable, navigation order of a slide may not match the tabbing order. Sighted users may see a logical navigation process (such as visual steps in the process for assembling a lawn mower). This "flow" is not conveyed by the tab order. The user might tab from step 1 and land on step 4. Another problem is the construction of model-based authoring tools on a Web page. In a model-based authoring tool, a visual object may provide a number of paths that the user can take, such as a multiplexor, which may have output that logically flows to a number of optional electronic components in a drawing. In Web 2.0, developers are actually creating drawings like this to perform tasks such as visually model a work flow. In this scenario, the user will want to decide which object they will navigate their screen reader or alternate input device to next. </p>
<p>Although it is recommended that Tab order follow the reading flow, there may be instances where this is not possible. For these reasons, WAI-ARIA provides a relationship property, called <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-flowto"><code>aria-flowto</code></a>. This allows the author to provide an assistive technology with alternative navigation flows through the document that best represents the author's intent and which is more logical for people with disabilities. <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-flowto"><code>aria-flowto</code></a> establishes the recommended reading order of content, so that the an assistive may overriding the default of reading in document order to its user. <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-flowto"><code>aria-flowto</code></a> does not change the keyboard navigation order of they browser.</p>
<p>Consider the first case of changing a basic reading flow to circumvent(X)HTML tabbing. A good example of this is a logical reading flow in a portal with landmarks. In the future, the user may wish to change the reading flow based on the order of priority with which they navigate a personalized Web application like <a href="http://www.myspace.com/">MySpace</a> or <a href="http://my.yahoo.com/">MyYahoo</a>. In the following example, the navigation would follow the order of "Top News Stories", "television listings", "stock quotes", and "messages from friends" by following (X)HTML document reading order. However, the author or end user may determine that the main content is most important, followed by "stock quotes", "messages from friends", and then "TV listings."</p>
<pre class="example" xml:space="preserve"><html>
...
<div role="main" title="Top News Stories" id="main" aria-flowto="stock"></div>
<div role="complementary" title="television listings" id="tv"></div>
<div role="complementary" title="stock quotes" id="stock" aria-flowto="messages"></div>
<div role="complementary" title="messages from friends" id="messages" aria-flowto="tv"></div> </pre>
<p>The second use case is such that the Web developer may wish to circumvent the flow by branching to multiple paths in the Web page, requiring the assistive technology to present a collection of options where the user could go next. This is important for work flows or business process management applications as shown in this <a href="http://www.skelta.com/products/screenshot-gallery/screens.aspx#ProcessDesigner">Process Designer Tool</a>. More of these applications are becoming Web based, and a vehicle is required to tell the user how to get through the work flow. The flowto property takes multiple idrefs, allowing the author to define each object the user could flow to. To implement this technique do the following. </p>
<ul><li>
<p><a id="step1_obj_accessible" name="step1_obj_accessible"></a>Make each object in the work flow accessible</p>
<p>This will require assigning a title or WAI-ARIA label for each object and a unique HTML id. Also, if the html element is repurposed assign it a WAI-ARIA role. </p>
<pre class="example" xml:space="preserve"><html>
...
<img src="foo.jpg" id="331" title="What is the Invoice Value?">
<img src="foo.jpg" id="333" title="Finance Manager Approval">
<img src="foo.jpg" id="334" title="Sales Manager Approval">
... </pre>
</li><li><a id="step2_flowto" name="step2_flowto"></a>Assign the flowto properties
<p>For each visual object that will flow to one or more other objects assign the flowto property the list of IDs to which it flows. </p>
<pre class="example" xml:space="preserve"><html>
...
<img src="foo.jpg" id="331" title="What is the Invoice Value?" aria-flowto="333 334">
<img src="foo.jpg" id="333" title="Finance Manager Approval">
<img src="foo.jpg" id="334" title="Sales Manager Approval">
... </pre>
<p>Each element referenced by the flowto must have have a unique id. The combination of the unique id and the name allow the assistive technology to adequately assist the user in retracing their steps backward through a flow to reference or moving forward to it. Since the author sets only the target the user agent is responsible for mapping the backward reference relationship. Therefore, neither the user agent nor the user can get lost. The host user agent does not provide an alternative navigation order; this is an assistive technology function.</p>
</li><li><a id="step3_keyboard" name="step3_keyboard"></a>Make sure visual objects are keyboard accessible
<p>Use tabindex to enable objects to receive focus. Actually setting focus to them may be performed by an assistive technology, such as an alternative input device. This example places each drawing object in document order with respect to the tab sequence. </p>
<pre class="example" xml:space="preserve"><img src="foo.jpg" id="331" title="What is the Invoice Value?"
aria-flowto="333 334" tabindex="0">
<img src="foo.jpg" id="333" title="Finance Manager Approval" tabindex="0">
<img src="foo.jpg" id="334" title="Sales Manager Approval" tabindex="0">
... </pre>
<p>When an assistive technology encounters "What is the Invoice Value?," it will know to tell the user that they may choose to navigate either to the "Financial Manager Approval" or to the "Sales Manager Approval" object. The options may be provided through a menu for the What is the Invoice Value object by the assistive technology. After a choice is made, then the AT can move focus to the target object; or in the case of a screen reader, it may just move the user to that location in the screen reader's virtual buffer. </p>
<p>Note: WAI-ARIA does not specify backward flowto properties for the same reason that we do not have the reverse of relationships like labelledby. The author may incorrectly do the reversal, creating a whole set of new problems. Rather, the task of the reversal relationships may be handled by the user agent through its accessibility API mapping or in the assistive technology itself.</p>
</li></ul>
</div>
<div class="section" id="relations_haspopup">
<h3><span class="tocnum">4.4. </span> Popups and drop-downs</h3>
<p>In order for menus, menubars, and menuitems to indicate that it opens a menu, set its <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-haspopup"><code>aria-haspopup</code></a> property to "true." The type of menu being launched (submenu, context help, etc.) is not explicitly indicated with WAI-ARIA but is based on the operational characteristics (keyboard and mouse commands). </p>
<p>Combo boxes, or drop down lists, work differently. Controls with the role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#combobox"><code>combobox</code></a> must contain a list of items that can be opened, usually as a drop-down. Because this is intrinsic to the functioanlity of a combo box, it does not need to be explicitly indicated with <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-haspopup"><code>aria-haspopup</code></a>.</p>
<p>The following html fragment shows the use of <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-haspopup"><code>aria-haspopup</code></a> with a menubar, its menus, and submenus. All of the menuitems associated with the menubar have <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-haspopup"><code>aria-haspopup</code></a> set to 'true'. Also, the "Zoom" menuitem of the "View" menu has an <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-haspopup"><code>aria-haspopup</code></a> property as it leads to a submenu.</p>
<pre class="example" xml:space="preserve"><span class="tag"><div role=<span class="str">"menubar"</span>></span>
<span class="comment"><!--
File menu: File menuitem has an aria-haspopup attribute set to 'true'.
That popup div follows immediately below.
--></span>
<span class="tag"><div role=<span class="str">"menuitem"</span> <em>aria-haspopup=<span class="str">"true"</span></em> id=<span class="str">"fileMenu"</span>></span>File<span class="tag"></div></span>
<span class="tag"><div role=<span class="str">"menu"</span> aria-labelledby=<span class="str">"fileMenu"</span>></span>
<span class="tag"><div role=<span class="str">"menuitem"</span>></span>Open<span class="tag"></div></span>
<span class="tag"><div role=<span class="str">"menuitem"</span>></span>Save<span class="tag"></div></span>
<span class="tag"><div role=<span class="str">"menuitem"</span>></span>Save as ...<span class="tag"></div></span>
...
<span class="tag"></div></span>
<span class="comment"><!--
View menu:
--></span>
<span class="tag"><div role=<span class="str">"menuitem"</span> <em>aria-haspopup=<span class="str">"true"</span></em> id=<span class="str">"viewMenu"</span>></span>View<span class="tag"></div></span>
<span class="tag"><div role=<span class="str">"menu"</span> aria-labelledby=<span class="str">"viewMenu"</span>></span>
<span class="tag"><div role=<span class="str">"menuitem"</span>></span>Normal<span class="tag"></div></span>
<span class="tag"><div role=<span class="str">"menuitem"</span>></span>Outline<span class="tag"></div></span>
<span class="comment"><!--
The View's Zoom menuitem has aria-haspopup='true' as it leads to a
submenu.
--></span>
<span class="tag"><div role=<span class="str">"menuitem"</span> <em>aria-haspopup=<span class="str">"true"</span></em> id=<span class="str">"zoomSubMenu"</span>></span>Zoom<span class="tag"></div></span>
<span class="tag"><div role=<span class="str">"menu"</span> aria-labelledby=<span class="str">"zoomSubMenu"</span>></span>
<span class="tag"><div role=<span class="str">"menuitem"</span>></span>50%<span class="tag"></div></span>
<span class="tag"><div role=<span class="str">"menuitem"</span>></span>75%<span class="tag"></div></span>
<span class="tag"><div role=<span class="str">"menuitem"</span>></span>100%<span class="tag"></div></span>
<span class="tag"><div role=<span class="str">"menuitem"</span>></span>150%<span class="tag"></div></span>
<span class="tag"><div role=<span class="str">"menuitem"</span>></span>200%<span class="tag"></div></span>
<span class="tag"></div></span>
<span class="tag"></div></span>
<span class="tag"></div></span></pre>
</div>
</div>
<div class="section" id="docmgt">
<h2><span class="tocnum">5. </span> Managing Dynamic Changes</h2>
<div class="section" id="ContentPresChanges">
<h3><span class="tocnum">5.1. </span> Managing Content and Presentational Changes </h3>
<p>General rules for managing content and displaying information</p>
<ul><li>Do not change an element's role once it has been set. If you need to change the role of an object, first remove the element from the DOM tree and then add the new element to the tree with the new role set. </li><li>For supporting browsers, tie CSS attribute selectors to WAI-ARIA properties to reduce script (browser issue with refresh).</li><li>Tie CSS <code>display</code> property to WAI-ARIA hidden state. This is important for assistive technologies who communicate directly with the user agent's DOM versus a platform accessibility API supported by the user agent. You can also tie <a href="http://www.w3.org/TR/1998/REC-CSS2-19980512/visufx.html#visibility">CSS <code>visibility:hidden</code></a> or <code><a href="http://www.w3.org/TR/1998/REC-CSS2-19980512/visufx.html#visibility">visibility:collapse</a></code> to the WAI-ARIA hidden state but the use of <code><a href="http://www.w3.org/TR/1998/REC-CSS2-19980512/visufx.html#visibility">visibility:hidden</a></code> will affect layout in that content will continue to flow around the hidden area even though the content to be hidden is invisible. </li></ul>
<p>If you are refreshing areas asynchronously, then you need to designate live regions. The following sections explain how to implement live regions and when to use roles that are considered "live" sections by default, including alert, status, or log.</p>
</div>
<div class="section" id="LiveRegions">
<h3><span class="tocnum">5.2. </span> Implementing Live Regions </h3>
<p><a href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#attrs_liveregions">Live regions</a> are parts of a Web page that the author expects to change. Examples of live regions include tables with dynamically updated content (sports stats, stock information), logs where new information is being added (chat transcript logs), notification areas (status, alerts), etc. </p>
<p>Live regions enable assistive technologies, such as screen readers, to be informed of updates without losing the users' place in the content. Live region settings provide hints to assistive technologies about how to process updates. Note that the assistive technology is responsible for handling these updates and enabling users to override these hints. </p>
<p>The section on <a href="#liveprops">Live Region Properties</a> and how to use them gives the details of how to apply live region properties. This process will help rich internet application (RIA) developers to set live region settings that will provide a good user experience for most assistive technology users with little configuration on their part. When applying these live region properties, it is recommended that you conduct user testing. If the <acronym title="assistive technology">AT</acronym> supports scripting of the response to live regions you may wish to customize the response, such as through a screen reader script for your Web page.</p>
<ol><li>
<p><strong>Identify the live regions</strong></p>
<p>Live regions are any region on a page that receives dynamic updates through client-side scripting. Note the regions of your page that will be live. </p>
</li><li>
<p><strong>See if any of the special case live regions meet your needs</strong></p>
<p> WAI-ARIA provides a number of <a href="#chobet">special case live region roles</a> whose live region properties are pre-defined and which you may use. If one of these live region roles meet your needs just apply the specific role to the region of the Web page.</p>
</li><li>
<p><strong>Decide the priority of each live region</strong></p>
<p>When a live region changes, should the user be notified of the change? Notifications could include a sound for a screen reader user. (For simplicity, we will use the case of an audio notification in this discussion.) The shorter the interval between changes and the less important the information, the less likely that the user needs to hear every change. A simple example of changes that should not be heard are changes to time; a sound for every second would be very annoying. </p>
<p>If the user should hear the change, should the change be announced immediately, as soon as possible, or only when the user is idle? Announcing a change immediately can be disorienting for users, so that should be done sparingly. Most updates should probably only be announced when the user is idle. </p>
<p>After you have decided the priority for each live region, then decide the <em>live</em> property value: </p>
<ul><li>Never spoken, then <code><a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-live"><code>aria-live</code></a>="off"</code> </li><li>Spoken when user is idle, then <code><a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-live"><code>aria-live</code></a>="polite" </code></li><li>Spoken as soon as possible, then <code><a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-live"><code>aria-live</code></a>="assertive"</code> </li><li>For more specifics, see <a href="#liveprops" title="Live Region Properties">Live Region Properties</a>.</li></ul>
</li><li>
<p><strong>Decide how much context is needed for each update</strong></p>
<p>When part of a live region changes, how much context is needed to understand the change. Does the user need to hear the entire live region or just the change by itself? </p>
<p>If the user needs to hear the entire live region, then mark the entire live region with <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-atomic"><code>aria-atomic</code></a>="true". </p>
</li><li>
<p><strong>Decide what types of changes are relevant for each live region</strong></p>
<p>Three possible types of changes are: additions, removals, and text. <em>Additions</em> means new nodes are added to the DOM; <em>removals</em> means nodes are removed from the DOM; and <em>text</em> means changes are solely to the textual content. Should the user hear all types of changes or only certain types? </p>
<p>By default, the user will hear additions and text type changes. If you wish to explicitly define the types of changes, you need to set relevant="THE_TYPES_OF_CHANGES". If more than one type of change is relevant, the types are separated by a space. For example, to define additions and removals as relevant but not text, set relevant="additions removals". </p>
</li></ol>
<div class="section" id="liveprops">
<h4><span class="tocnum">5.2.1. </span> Live Region Properties and How to Use Them</h4>
<p>One of the most important concepts behind live regions is politeness. Politeness indicates how much priority a live region has. The following politeness values are available for <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-live"><code>aria-live</code></a>: off, polite, and assertive.</p>
<dl><dt><a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-live"><code>aria-live</code></a>="off"</dt><dd>This is the default. Any updates made to this region must not be announced to the user. live="off" would be a sensible setting for things that update very frequently such as GPS coordinates of a moving vehicle.</dd><dt><a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-live"><code>aria-live</code></a>="polite"</dt><dd>Any updates made to this region should only be announced if the user is not currently doing anything. live="polite" should be used in most situations involving live regions that present new information to users, such as updating news headlines.</dd><dt><a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-live"><code>aria-live</code></a>="assertive"</dt><dd>Any updates made to this region are important enough to be announced to the user as soon as possible, but it is not necessary to immediately interrupt the user. live="assertive" must be used if there is information that a user must know about right away, for example, warning messages in a form that does validation on the fly.</dd></dl>
<p>There are times to suppress AT presentation changes while a region is updating. For that you can use the <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-busy"><code>aria-busy</code> (state)</a> property.</p>
<dl><dt><a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-busy"><code>aria-busy</code> (state)</a>="true"</dt><dd>
<p>To suppress presentation of changes until a region is finished updating or until a number of rapid-fire changes are finished, set <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-busy"><code>aria-busy</code> (state)</a>="true" and then clear the attribute when the region is finished. While it is busy, the AT will track and collate the changes. It will finally speak the changes once the region is no longer busy.</p>
</dd></dl>
<p>When a live region is updated, the update can often be announced on its own and still make sense. For example, if a news headline is added, it would make sense to simply announce the headline. However, sometimes the entire live region must be read in order to give the user enough context to make sense of the update. For example, it would not make sense to only give the current value of a stock without saying the name of the stock. The atomic setting gives assistive technologies a hint about which of these cases an update falls into. </p>
<dl><dt><a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-atomic"><code>aria-atomic</code></a>="false"</dt><dd>This is the default. It means that when there is a change in the region, that change can be presented on its own; the AT should not present the entire region. atomic="false" is generally a good idea as it presents users with only changes and does not cause them to hear repetitive information that has not changed. However, Web developers should take care that the changed information, when presented by itself, can still be understood and contextualized by the user. </dd><dt><a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-atomic"><code>aria-atomic</code></a>="true"</dt><dd>If atomic is set to "true", it means that the region must be presented as a whole; when there is a change, the AT should present the entire region, not just the change. atomic="true" can make it harder for users to understand changes as the changed areas are not presented independently. atomic="true" can also be annoying as it can force users to listen to repetitive information that has not changed. However, atomic="true" is necessary in cases where the change, when presented by itself, cannot be understood and contextualized by the user. Note that when aria-atomic="true", the AT will attempt to speak the atomic region only once when multiple changes occur in the same region and it hasn't been spoken yet. </dd></dl>
Not all updates to a live region are relevant. For example, if the oldest headline in a list of headlines is removed and a new headline is added, the removal of the oldest headline is probably not important enough to announce to the user. However, in a chat application, when a user leaves the chat and their username is removed from the list of users, that removal may be important enough to announce. The relevant setting gives a hint about what types of changes are relevant and should be announced. Any change which is not relevant will be treated as if the region had live="off" and will not be announced. Multiple types of changes can be listed as relevant; the types are separated by a space. The default is relevant="additions text" and this is the most common use case. If the default is applicable to your application, you do not need to provide the relevant property explicitly.
<dl><dt><a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-relevant"><code>aria-relevant</code></a>="additions"</dt><dd>Insertion of nodes to the live region should be considered relevant. </dd><dt><a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-relevant"><code>aria-relevant</code></a>="removals"</dt><dd>Removal of nodes to the live region should be considered relevant.
Often, removals are not relevant because nodes are removed to make space for new information - e.g. a log implemented as a table where items are taken off the top. However, in the case of something like a buddy list, it is relevant if a buddy is removed. It doesn't require the screen reader to speak the removal, but it notifies the screen reader that it could be useful to do so. Use of <code>aria-relevant="removals"</code> or <code>aria-relevant="all"</code> should be used sparingly. Notification of an assistive technology when content is removed may cause an unwarranted number of changes to be notified to the user. </dd><dt><a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-relevant"><code>aria-relevant</code></a>="text"</dt><dd>Changes to the textual content of nodes that already exist in the live region should be considered relevant. Textual content includes text equivalents, such as the alt attribute of images. </dd></dl>
<p> This example shows two live regions. If both regions update simultaneously, liveRegionA should be spoken first because its message has a higher priority than liveRegionB. </p>
<blockquote>
<pre class="example" xml:space="preserve"><div id="liveRegionA" aria-live="assertive">
</div>
<div id="liveRegionB" aria-live="polite>
</div></pre>
</blockquote>
</div>
</div>
<div class="section" id="chobet">
<h3><span class="tocnum">5.3. </span> Choosing Between Special Case Live Regions</h3>
<p>You may wish to use a special live region role instead of applying live region properties. WAI-ARIA contains a number of standard roles which are by default considered "live" sections of your Web page. It is important to know when to use these and when to create a custom live region on your known. Here are some rules of thumb:</p>
<blockquote>
<p><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#alert"><code>alert</code></a> - You must use the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#alert"><code>alert</code></a> role for a one-time notification which shows for a period of time and goes away and is intended to alert the user that something has happened. The assistive technology should be notified by the user agent that an alert has occurred, if your operating system supports this type of event notification. When choosing to use alert you should use the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#alertdialog"><code>alertdialog</code></a> role instead if something inside the alert is to receive focus. Both <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#alert"><code>alert</code></a> and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#alertdialog"><code>alertdialog</code></a> appear to pop-up to the user to get their attention.</p>
<p><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#status"><code>status</code></a> - You must use the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#status"><code>status</code></a> role when you want to mark an area which is updated periodically and provides general status of your Web application. Changes in status are not typically announced automatically by an assistive technology. However, it is possible to configure some assistive technologies, such as a scriptable screen reader, to watch for changes in the status bar and announce them. Using the status role is also important in that the user could always check the status section for changes in status on different Web pages. Many applications provide status widgets and they are often found, visibly, at the bottom of the application and contain a variety of widgets within it to convey status. The use of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#status"><code>status</code></a> does not guarantee how the AT will respond to changes in the status. The author can still put live="off" or live="assertive" to influence the ATs treatment of the status. </p>
<p><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#timer"><code>timer</code></a> - You must use a timer role when you want to mark an area which indicates an amount of elapsed time from a start point, or the time remaining until an end point. The text encapsulated within the timer indicates the current time measurement, and are updated as that amount changes. However, the timer value is not necessarily machine parsable. The text contents <strong>MUST</strong> be updated at fixed intervals, except when the timer is paused or reaches an end-point. </p>
<p><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#marquee"><code>marquee</code></a>- You must use a marquee role when you need to mark an area with scrolling text such as a stock ticker. The latest text of the scrolled area must be available in the DOM. A marquee behaves like a <a href="#liveprops">live region</a>, with an assumed default <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-live"><code>aria-live</code></a> property value of "polite."</p>
<p><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#log"><code>log</code></a> - You must use log if you have a live area where new information is added, like a scrolling chat log of text. Unlike other regions, implied semantics indicate the arrival of new items and the reading order. The log contains a meaningful sequence and new information is added only to the end of the log, not at arbitrary points. If you have a chat text entry area you should indicate that it also controls the aria log aria like so:</p>
<pre class="example" xml:space="preserve"><div contenteditable="true" role="log" id="chatlog">
</div>
<label id="gettext">Send Text</label>
<div aria-controls="chatlog"
role="textbox"
contenteditable="true"
aria-labelledby="gettext">
</div</pre>
<p><a href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#attrs_liveregions">live region</a> - If you have some other live area use case, WAI-ARIA allows you to mark an area using the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-live"><code>aria-live</code></a> attribute. This accompanied by the collection of attributes which support the live property allow you to create your own custom live area on your Web page. For more details regarding live regions refer to the <a href="#LiveRegions">live region</a> section of this guide.</p>
</blockquote>
</div>
</div>
<div class="section" id="ariaform">
<h2><span class="tocnum">6. </span> Form Properties</h2>
<p>
This section identifies authoring practices for elements used as form elements.
</p>
<div id="use_invalid">
<h3 id="useinvalid">Use aria-invalid and aria-required To Improve Access to Forms</h3>
<p>
Until the introduction of WAI-ARIA's aria-invalid state and aria-required property, only presentational strategies have been available to Web content authors to indicate that certain form fields and controls are required or invalid. In applications, these states are only available through styling or varying markup, which is inconsistent, and therefore is inconclusive. In Web-based forms, fields required may be marked by an asterisk. Forms submitted with required data missing or improperly specified may be redisplayed with the unacceptable elements highlighted in red. The assistive technology user is poorly served by such imprecise methods, and all users confront inconsistent indicators for consistent situations.
</p>
<p>
The WAI-ARIA invalid state and required property provide:
</p>
<ul><li>
A programmatic aria-required property that can be applied to a form element to indicate to an AT that it is required to complete the form.
</li><li>
A programmatic aria-invalid state that can be used to indicate which data fields have incorrect data to an AT so that the user knows they have entered invalid data. Invalid data is often rendered in red by HTML form developers.
</li></ul>
<h3 id="alertmax">Alert the User When Maximum Length Value Is Reached</h3>
<p>When a text input field that has a maximum length value (or the host markup language's equivalent) receives focus, the value defined for
"maximum length" should be communicated to the user. When text entry reaches that maximum length (or the markup language's equivalent), an alert (expressed in accordance with user preferences and capabilities) should inform the user that the maximum length for a given field has been reached. Such an alert can be expressed programmatically or, using as an aural icon, by using a WAI-ARIA alert; the user agent may alert the user through a system beep and by triggering the operating systems' "show sounds" facility. When maximum length (or the markup language's equivalent) is reached, the user must then be able to move to another form field in a manner consistent with tab-navigation for that document.</p>
</div>
<div id="focus_change">
<h3 id="auto_focus_change">Automatic Focus Changes</h3>
<p>Having a user agent automatically change focus in a form in response to user input can be advantageous in situations where that change saves the user keystrokes or on-screen keyboard interaction in order to manually move the focus from one field to another. However, as with form auto-completion, this type of text input event must be firmly under user control because this may not have been the user's intention and some users with disabilities may become disoriented such as those with sight impairments. Consider these cases:</p>
<ul><li>For a text input field that automatically moves focus to a new
field when the value defined for "maximum length" (or the markup language's
equivalent) is reached, the user must have the ability to suppress the change in focus. Otherwise, the user's assistive
technology may not be able to make the user aware of the error.</li><li>
A textarea field that has a scripted counter to display the number
of characters entered or the number of characters available for input;
in this case, the dynamic content (the character count) must be owned
by the textarea as a live region, so that the user can keep either a
running (real-time) account of how many characters are left for him
to input or can obtain such information on user query.</li></ul>
</div>
<div id="autosubmit">
<h3 id="form_autosubmit">Form Auto-submit</h3>
<p>Use caution when using automatic submission of a form without explicit user command or
in response to a user-defined setting that permits such behavior, as
expressed by the Priority 1 <acronym title="User Agent Accessibility Guidelines 1.0">UAAG 1.0</acronym> Checkpoints
<a href="http://www.w3.org/TR/UAAG10/guidelines.html#tech-selection-focus-conventions">7.1</a>,
<a href="http://www.w3.org/TR/UAAG10/guidelines.html#tech-default-input-sensible">7.2</a> and
<a href="http://www.w3.org/TR/UAAG10/guidelines.html#tech-info-current-ua-config">11.1</a>.
Unless the user has specifically chosen to set the user agent to allow auto-submission, authors are advised not to set onChange or onFocus events either to trigger submission of a form or to provide an auto-submission event upon
completion of all or all required fields of a form or input
field. </p>
</div>
</div>
<div class="section" id="math">
<h2><span class="tocnum">7. </span> Math</h2>
<p class="ednote">Editors' note: This section was added as part of disposition of comment 4, but is very incomplete. The section needs to be reordered, so that instructions on how to use the math role properly appear before considerations of legacy content and negative examples (such as the use of generic HTML to approximate a visual representation of a mathmatical expression). It needs more introductory text about how to use math. The examples need better introductions, and the positive examples should preceded the negative examples, which need to be explained more fully.</p>
<p>There exists significant amounts of legacy content that uses images
and/or textual approximations to represent mathematical expressions.
Examples of this include the use of ASCII art and/or the misuse of
HTML tags -- in particular, SUB and SUP -- to achieve a visual
approximation of a mathematical expression, one which is void of
the structure needed to render mathematical expressions inherently
meaningful.</p>
<p>Use of generic HTML to approximate a visual rendering
of a mathematical expression:</p>
<p><code class="example"><i>a</i><i>x</i><sup>2</sup> + <i>b</i><i>x</i> + <i>c</i> = 0</code> </p>
<p>Accessible example of the same function, using the math role, appropriate label, and MathML rendering:</p>
<pre class="example" xml:space="preserve"><div role="math" aria-label="a times x squared plus b times x plus c equals 0">
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<mrow>
<mrow>
<mrow>
<mi>a</mi>
<mo>&#x2062; <!-- invisible times --></mo>
<msup>
<mi>x</mi>
<mn>2</mn>
</msup>
</mrow>
<mo>+</mo>
<mrow>
<mi>b</mi>
<mo>&#x2062; <!-- invisible times --></mo>
<mi>x</mi>
</mrow>
<mo>+</mo>
<mi>c</mi>
</mrow>
<mo>=</mo>
<mn>0</mn>
</mrow>
</math>
</div></pre>
<p>Similarly:</p>
<p><code>
<i>f</i>(<i>x</i>)
= <i>x</i><sup>2</sup> + <i>x</i> - 2
</code></p>
<p>Accessible example of the same function, using the math role, appropriate label, and MathML rendering: </p>
<pre xml:space="preserve"><div role="math">
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<mrow>
<mrow>
<mi>f</mi>
<mo>&#x2061;</mo>
<mrow>
<mo>(</mo>
<mrow>
<mi>x</mi>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
<mo>=</mo>
<mrow>
<msup>
<mi>x</mi>
<mn>2</mn>
</msup>
<mo>+</mo>
<mi>x</mi>
<mo>&#x2212;</mo>
<mn>2</mn>
</mrow>
</mrow>
</math>
</div></pre>
</div>
<div class="section" id="dragdrop">
<h2><span class="tocnum">8. </span> Drag-and-Drop Support </h2>
<p>Drag-and-drop operations are a common feature of Rich Internet
Applications (RIAs). Drag-and-drop features have traditionally
challenged people with functional disabilities. These problems arise
from the difficulty of manipulating the mouse, finding targets capable
of receiving the object being dragged, and actually moving the object to
the drop target. Screen readers and alternate input systems assist the
user to some degree by allowing the user to simulate a click, drag, and
release operation. It is then up to the user to find a target that,
hopefully, will receive the object(s) being dragged. Additionally, the
user may not be aware if the desired drop operation is supported or what
source objects can be selected for dragging. The end result can be a
very unproductive and frustrating experience.
</p>
<p>WAI-ARIA introduces two new <a href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#attrs_dragdrop">Drag and Drop properties</a> that aide Web application authors with the drag and drop process, called <em>aria-grabbed</em> and <em>aria-dropeffect.</em> The property <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-grabbed"><code>aria-grabbed</code> (state)</a> is applied to the source(s) being dragged, while <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-dropeffect"><code>aria-dropeffect</code></a> is applied to the target(s). Use of these properties--combined with best practices for enabling the user to select the appropriate drag operations and for assigning appropriate keyboard operations for dragging and dropping--will vastly improve the accessibility of drag and drop functionality. The following steps will guide you through the process. </p>
<ol><li>
<p><strong>Identify draggable objects</strong></p>
<p>Set the initial <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-grabbed"><code>aria-grabbed</code> (state)</a> state of all draggable interface objects.
Roles that typically support drag and drop operations are <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listitem"><code>listitem</code></a> and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#treeitem"><code>treeitem</code></a>. The default state for all objects is assumed to be undefined, meaning that they are not draggable. For objects that may be dragged, set the <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-grabbed"><code>aria-grabbed</code> (state)</a> state to "false". This will allow assistive technologies to indicate which objects are draggable and potentially facilitate in choosing the objects to grab. </p>
<p class="note">Objects that can be dragged need to have a determinable role. HTML tags such as <code><div></code> and <code><span></code> provide no semantics, unlike <code><select></code>, and would require you to set the WAI-ARIA role attribute.</p>
<p>This step clearly marks elements that can be "grabbed" for drag-and-drop operation. Assistive technologies, such as screen readers or alternate input devices, can help the user move focus directly to the grab-supporting objects without having to navigate through all the elements and to guess which could be ready to initiate a drag operation. Although not necessary, authors or intermediaries could use CSS to highlight those elements that may be grabbed. At this point, qualified drop targets cannot be determined as they are determined based on the objects being dragged--which have not yet been selected.</p>
<p>All grabbable objects must be navigable using the keyboard. </p>
</li><li>
<p><strong>Allow the user to initiate the appropriate drag operation using the keyboard</strong></p>
<p>The author must provide a keyboard accessible way of selecting one or
more elements to drag. It is recommended that the space bar be used for
selection. It is further recommended that <kbd>Shift+Space</kbd> be used to select
multiple objects and define a contiguous set; and that control+space be
used to define a noncontiguous set. As each object is selected, its
<a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-grabbed"><code>aria-grabbed</code> (state)</a> property must be set to "true", giving the ATs references as
to what has been grabbed. It is recommended that <kbd>Ctrl+M</kbd> be supported
to indicate that all objects have been selected for drag.</p>
<p class="note">
Note: Selection of the objects to be dragged may differ depending on
their type. For example, a list of emails might be selected one at a time or many at a time in contiguous or non-contiguous manner using the <kbd>Space</kbd> key as indicated above. However, text in
a document might better be selected by positioning the cursor at the
beginning of a word and holding down the <kbd>Ctrl</kbd> key while using the
right and left arrow keys to mark the letters you wish to move.</p>
</li><li>
<p><strong>Mark the drop targets</strong></p>
<p>When the user has completed selecting source objects to drag, you must indicate which targets may receive them by setting the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-dropeffect"><code>aria-dropeffect</code></a> properties on those targets. This will indicate to the assistive technology that all objects have been grabbed as well as what targets are capable of receiving the drop.</p>
<p>When using a mouse, users click, hold the mouse button, and drag the mouse when moving the selected objects, and, by implication, are no longer selecting them. With respect to keyboard users, the previous section, Item 2, "Allow the user to initiate the appropriate drag operation using the keyboard", recommends using Control+M to indicate the end of the selection phase.</p>
<dl><dt>* copy:</dt><dd>A duplicate of the source object will be dropped onto the target.</dd><dt>* move:</dt><dd>The source object will be removed from its original location and
dropped onto the target.</dd><dt>* link:</dt><dd>A reference or short cut to the dragged object will be
created in the target object.</dd><dt>* execute:</dt><dd>A function supported by the drop target is executed, using
the drag source as an input.</dd><dt>* popup:</dt><dd>The author must provide a popup menu or dialog to allow the
user to choose one of the drag operations (copy, move, reference) and
any other drag functionality, such as drag cancel.</dd><dt>* none:</dt><dd>no drop operation is supported. This is the default for all
objects. </dd></dl>
<p>Example:</p>
<pre xml:space="preserve">
<div role="treeitem" aria-dropeffect="copy move popup">
</pre>
<p>
CSS may also be used to highlight the targets to show sighted users
which objects can receive a drop of the grabbed source(s). Any object
without an <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-dropeffect"><code>aria-dropeffect</code></a> property set will have an assumed
aria-dropeffect value of "none." Any object with an <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-dropeffect"><code>aria-dropeffect</code></a> value
of "none" is ignored by ATs in the drop operation. </p>
</li><li>
<p><strong>Implement keyboard functionality to assist the user and AT with
executing the drop.</strong></p>
<p>After all objects have been grabbed, the author should provide standard
keyboard accessible navigation (such as through tabbing) to enable the
user to navigate to the desired drop target. To achieve this, you may
optionally support <kbd>Shift+F10</kbd> to invoke a single select list of possible
drop targets from which the user may choose a single drop target that,
when selected, would move focus to that drop target.
Otherwise, you must provide a keyboard accessible way (through tabbing
and arrowing) to allow the user to navigate to the drop target. The
user's point of regard should be clearly visible during this navigation.</p>
<p>
When the user arrives at the drop target the author should provide a
keyboard accessible way to drop the selected object(s) onto the target.
<kbd>Ctrl+M</kbd> should be used to provide the most intuitive type of drop,
either copy, move, or a shortcut. In the case of only one
drop operation available, the <kbd>Ctrl+M</kbd> should be used to drop the selected object(s)
onto the target.</p>
<p>
If drop target supports additional drop operations, then the
author should provide a WAI-ARIA-enabled pop-up menu from which the user
can choose supported operations from the list. A recommended way to
invoke this menu is to use the <kbd>Shift+Ctrl+M</kbd> key sequence when focus
is on the drop target. Furthermore, the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-dropeffect"><code>aria-dropeffect</code></a> property should include "popup" in its list of values to indicate that a
keyboard accessible menu is provided. After the user has selected an
action from the pop-up menu, the menu must close, with focus returning
to the drop target. If the user does not choose an action and instead
presses the <kbd>Esc</kbd> key, the application must dismiss the menu,
returning focus to the drop target.</p>
</li><li><p><strong>Cancelling a drag operation</strong></p>
<p>Users can cancel the entire drag operation at any time, with one exception, by pressing the <kbd>Esc</kbd> key. The one exception is when the drop operations pop-up menu is displayed (see previous step four above). In this case, <kbd>Esc</kbd> simply dismisses the pop-up, and a second <kbd>Esc</kbd> keystroke is needed to cancel the drag operation. When the drag operation is so cancelled, all <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-dropeffect"><code>aria-dropeffect</code></a> properties are set to "none", all grabbable objects' <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-grabbed"><code>aria-grabbed</code> (state)</a> properties are set to "false", and keyboard focus returns to the last grabbed source object. </p>
</li><li>
<p><strong>Clean-up after drag/drop</strong></p>
<p>Once the drop has occurred, you should clean up the DOM as you would do for drag-and-drop operation. This should include setting:</p>
<ul><li>All <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-dropeffect"><code>aria-dropeffect</code></a> properties to "none" or remove them altogether.</li><li>All <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-grabbed"><code>aria-grabbed</code></a> of draggable objects to "false".</li><li>All objects that are not grabbable must either omit the <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-grabbed"><code>aria-grabbed</code></a> property or have an <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-grabbed"><code>aria-grabbed</code></a> property set to "undefined."</li><li>Focus on the appropriate DOM element, and its role must also be determinable.</li></ul>
<p class="note">Other methods of performing the same
operation as drag-and-drop may be the best way to meet the accessibility
requirements. As an example, when moving a mail message from the inbox
to another folder, a list of those folders could be presented in a
select list as an alternative to drag-and-drop.</p>
</li><li>
<p><strong>Document non-recommended keyboard navigation</strong></p>
<p>If the author must use alternatives to the keyboard
navigation recommended here, it should be documented on the page.</p>
</li></ol>
</div>
<div class="section" id="aria-write">
<h2><span class="tocnum">9. </span> States and Properties Modified by an External Assistive Technology</h2>
<p>States and Properties that an Assistive Technology is likely to change: </p>
<ul><li>aria-activedescendant </li><li>aria-expanded</li><li>aria-grabbed</li><li>aria-selected </li><li>aria-sort</li><li>aria-valuenow</li></ul>
<p>Authors should monitor changes to these properties by monitoring <a href="<a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-MutationEvent">http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-MutationEvent</a>">DOM Mutation events</a> for attribute changes and respond accordingly by making the appropriate changes to your web application. Note that if any of these states and properties are set in error, the Web application is responsible for handling the error condition.</p>
<p>The following States and Properties are unlikely to be manipulated by an assistive technology: An AT would need to have greater understanding of the application and the results could be adverse.</p>
<ul><li>aria-atomic</li><li>aria-autocomplete</li><li>aria-busy</li><li>aria-checked</li><li>aria-controls</li><li>aria-describedby</li><li>aria-disabled</li><li>aria-dropeffect</li><li>aria-flowto </li><li>aria-haspopup</li><li>aria-hidden </li><li>aria-invalid </li><li>aria-labelledby </li><li>aria-level</li><li>aria-live </li><li>aria-multiline</li><li>aria-multiselectable</li><li>aria-owns</li><li>aria-posinset</li><li>aria-pressed</li><li>aria-readonly</li><li>aria-relevant </li><li>aria-setsize</li><li>aria-valuemax</li><li>aria-valuemin</li><li>aria-valuetext</li></ul>
</div>
<div class="section" id="aria_ex">
<h2><span class="tocnum">10. </span> Design Patterns</h2>
<p>For these widgets and structures, this document describes the keyboard interaction and identifies the relevant WAI-ARIA roles, states, and properties. </p>
<p>If the host language does not define key mappings, such as hot keys, and the author defines key mappings other than those described here or in <a href="#dragdrop">Drag-and-Drop Support</a>, then the author must provide documentation of those key mappings. These mappings can be provided in the contents of the web page, or in the case of a more complex application, within the help file documentation and training materials.</p>
<p class="note">Note: Although users of Mac OS X are familiar with using the Command key (<kbd>Cmd</kbd>) instead of the Control key (<kbd>Ctrl</kbd>), the Command key is typically reserved for desktop applications and OS-level integration. Until device and platform independence can be addressed in WAI-ARIA 2.0, the primary "Control" modifier key for WAI-ARIA widget interaction is specified as "Control" on all platforms, including Mac OS X.</p>
<ul class="miniindex"><li><a class="widget-reference" href="#accordion">accordion</a></li><li><a class="widget-reference" href="#alert">alert</a></li><li><a class="widget-reference" href="#autocomplete">autocomplete</a></li><li><a class="widget-reference" href="#button">button</a></li><li><a class="widget-reference" href="#checkbox">checkbox</a></li><li><a class="widget-reference" href="#combobox">combobox</a></li><li><a class="widget-reference" href="#datepicker">datepicker</a></li><li><a class="widget-reference" href="#dialog_modal">dialog_modal</a></li><li><a class="widget-reference" href="#dialog_nonmodal">dialog_nonmodal</a></li><li><a class="widget-reference" href="#dialog_tooltip">dialog_tooltip</a></li><li><a class="widget-reference" href="#draganddrop">draganddrop</a></li><li><a class="widget-reference" href="#grid">grid</a></li><li><a class="widget-reference" href="#landmarks">landmarks</a></li><li><a class="widget-reference" href="#link">link</a></li><li><a class="widget-reference" href="#listbox_div">listbox_div</a></li><li><a class="widget-reference" href="#mediaplayer">mediaplayer</a></li><li><a class="widget-reference" href="#menu">menu</a></li><li><a class="widget-reference" href="#menubutton">menubutton</a></li><li><a class="widget-reference" href="#popupmenu">popupmenu</a></li><li><a class="widget-reference" href="#popuphelp">popuphelp</a></li><li><a class="widget-reference" href="#radiobutton">radiobutton</a></li><li><a class="widget-reference" href="#richtext">richtext</a></li><li><a class="widget-reference" href="#slider">slider</a></li><li><a class="widget-reference" href="#slidertwothumb">slidertwothumb</a></li><li><a class="widget-reference" href="#spinbutton">spinbutton</a></li><li><a class="widget-reference" href="#tabpanel">tabpanel</a></li><li><a class="widget-reference" href="#toolbar">toolbar</a></li><li><a class="widget-reference" href="#tooltip">tooltip</a></li><li><a class="widget-reference" href="#treegrid">treegrid</a></li><li><a class="widget-reference" href="#TreeView">TreeView</a></li><li><a class="widget-reference" href="#windowsplitter">windowsplitter</a></li><li><a class="widget-reference" href="#wizard">wizard</a></li></ul>
<div id="aria_ex_widget">
<h4>Global Recommendations </h4>
<p>The following may apply to some or all widgets. </p>
<ul><li><kbd>Ctrl+Z</kbd> Optionally a developer may choose to implement undo functionality as needed. It is recommended that Control + Z be used. </li><li><kbd>Ctrl+Y</kbd> Optionally a developer may choose to implement redo functionality as needed. It is recommended that Control + Y be used. </li><li><kbd>Ctrl+C</kbd> Copies to clipboard </li><li><kbd>Ctrl+V</kbd> Pastes from clipboard </li><li><kbd>Ctrl+X</kbd> Copies to clipboard and cuts </li><li><kbd>Shift+F10</kbd> is used to bring up an associated <a href="#popupmenu">Popup Menu</a> </li><li><strong>Widgets within Widgets</strong> The general navigation model is for a user to tab to a widget, interact with the controls in that widget and then tab to move focus to the next widget in the tab order. By extension, when the construct of a widget contains another widget, tab will move focus to the contained widget because it is the next item in the tab order. This continues down the layers of widgets until the last widget is reached. For example: We have two widgets A and B on a page. Widget A contains within it Widget C and Widget C contains within it Widget D. When tabbing, focus would land on Widget A, then another tab would focus on C and then another tab would focus on widget D. Because D is the last widget in C and C is the last widget in A one more tab would move focus to B. </li></ul>
</div>
<hr/>
<div class="widget" id="accordion">
<h3 class="widget-name"><code>Accordion</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"><p>An accordion component is a collection of expandable panels associated with a common outer container. Panels consist of a header and an associated content region or panel. The primary use of an Accordion is to present multiple sections of content on a single page without scrolling, where all of the sections are peers in the application or object hierarchy. The general look is similar to a tree where each root tree node is an expandable accordion header. The user navigates and makes the contents of each panel visible (or not) by interacting with the Accordion Header. Terms for understanding accordions include:</p>
<dl><dt>accordion component:</dt><dd>Collection of panels within a common outer pane.</dd><dt>accordion header:</dt><dd>Label area of an accordion panel. This is where you find the control to expand or collapse the panels.</dd><dt>accordion panel:</dt><dd>Contents area associated with an accordion header.
</dd></dl>
</td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li><kbd>Tab</kbd> - When focus is on an accordion header, pressing the <kbd>Tab</kbd> key moves focus in the following manner:
<ol><li>If interactive glyphs or menus are present in the accordion header, focus moves to each in order. </li><li>When the corresponding panel is expanded (its <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-expanded"><code>aria-expanded</code></a> state is 'true'), then focus moves to the first focusable element in the panel. </li><li>If the panel is collapsed (its aria-expanded state is 'false' or missing), OR, when the last interactive element of a panel is reached, the next <kbd>Tab</kbd> key press moves focus as follows:
<ul><li>If a subsequent accordion panel is already expanded, focus moves to the first focusable element in this subsequent panel. </li><li>If no subsequent accordion panel is expanded, focus moves to the first focusable element outside the accordion component. </li></ul>
</li></ol>
</li><li><kbd>Left arrow</kbd>
<ul><li>When focus is on the accordion header, a press of up/left arrow keys moves focus to the previous logical accordion header. </li><li>When focus reaches the first header, further up/left arrow key presses optionally wrap to the first header. </li></ul>
</li><li><kbd>Right arrow</kbd>
<ul><li>When focus is on the accordion header, a press of down/right moves focus to the next logical accordion header. </li><li>When focus reaches the last header, further down/right arrow key presses optionally wrap to the first header </li></ul>
</li><li><kbd>Up arrow</kbd> - behaves the same as left arrow </li><li><kbd>Down arrow</kbd> - behaves the same as right arrow </li><li><kbd>Ctrl+Up arrow</kbd> - Moves focus from anywhere in the accordion content to its associated accordion header or tab respectively. </li><li><kbd>Ctrl+PageUp</kbd> -
<ul><li>When focus is inside of an accordion pane, pressing <kbd>Ctrl-PageUp</kbd> moves focus to the accordion header of the previous accordion pane. </li><li>When focus is in the first accordion header content, pressing <kbd>Ctrl-PageUp</kbd> optionally moves focus to the last accordion header. </li><li>Focus will simply move to the header and will require Enter/space to expand/collapse the accordion pane. </li></ul>
</li><li><kbd>Ctrl+PageDown</kbd> -
<ul><li>When focus is inside of an accordion pane, pressing <kbd>Ctrl-PageDown</kbd> moves focus to the header of the accordion pane. </li><li>When focus is in the last accordion header content, pressing <kbd>Ctrl-PageDown</kbd> optionally moves focus to the first accordion header. </li><li>In the case of an accordion, focus simply moves to the header and requires <kbd>Enter</kbd>/<kbd>Space</kbd> to expand/collapse the accordion pane. </li></ul>
</li><li><kbd>End</kbd> - When focus is on the accordion header, an <kbd>End</kbd> key press moves focus to the last accordion header. </li><li><kbd>Home</kbd> - When focus is on the accordion header, a <kbd>Home</kbd> key press moves focus to the first accordion header. </li><li><kbd>Enter/Space</kbd> - When focus is on an accordion header, pressing <kbd>Enter</kbd>/<kbd>Space</kbd> toggles the expansion of the corresponding panel.
<ul><li>If collapsed, the panel is expanded, and its aria-expanded state is set to 'true'. </li><li>If expanded, the panel is collapsed and its aria-expanded state is set to 'false'. </li></ul>
</li><li><kbd>Shift+Tab</kbd> - Generally the reverse of <kbd>Tab</kbd>.</li><li><kbd>Alt+Del</kbd> -
<ul><li>When deletion is allowed, with focus anywhere within the tab panel or tab, pressing <kbd>Alt-Del</kbd> will delete the current tab and tab panel from the tabbed interface control. If additional tabs remain in the tabbed interface, focus goes to the next tab in the tab list. If no additional tabs remain, then focus moves to the last place that held focus in the previous tab panel.</li><li>An alternative to providing a keystroke to close a tab is to provide a context menu that is associated with the tab title. When focus is on the tab, pressing <kbd>Shift-F10</kbd> or pressing the right mouse button will open a context menu with the close choice.</li><li>A warning should be given to the user before allowing the delete to occur.</li></ul>
</li></ul>
<p>In Firefox, pressing <kbd>Ctrl+PageUp</kbd> / <kbd>Ctrl+PageDown</kbd> moves between browser tabs. Firefox also supports <kbd>Ctrl+Tab</kbd> and <kbd>Ctrl+Shift+Tab</kbd> to move between tabs. Internet Explorer 7 also uses <kbd>Ctrl+Tab</kbd> and <kbd>Ctrl+Shift+Tab</kbd>. There may be advantages to using <kbd>Ctrl+PageUp</kbd>/<kbd>PageDown</kbd> as the keys to change tabs because it is a recognizable keystroke to at least Firefox users and it is also supported by the Windows operating system to move between panels in a tabbed dialog.</p>
<p>You should be aware of two issues with using <kbd>Ctrl+PageUp</kbd>/<kbd>PageDown</kbd>: </p>
<ul><li>The first arises when the user is within a tabbed interface control on a Web page. Here they can not easily switch browser tabs without first moving focus outside of the tabbed interface control. This may be acceptable. </li><li>The second arises when the entire web page is a tabbed interface control. In this case the user could not switch browser tabs unless the control on the web page ignored the <kbd>Ctrl+PageUp</kbd>/<kbd>PageDown</kbd> keypress (and thus letting the browser access it) when the first or last tab was reached. </li></ul> </td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><ul><li>The accordion component must have a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tablist"><code>tablist</code></a> and have <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-multiselectable"><code>aria-multiselectable</code></a>="true" This will enable an assistive technology, such as screen reader, to convey that the tablist is an accordion or a multiselectable tablist. This will also tell the user that the keyboard navigation matches an accordion and not a tablist. </li><li>Contained within the tablist is a set of tab/tabpanel pairs. </li><li>Each header tab in the tablist has a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tab"><code>tab</code></a>. </li><li>The accordion panel uses the role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tabpanel"><code>tabpanel</code></a> and should have an <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> relationship referencing the correponding header having a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tab"><code>tab</code></a></li><li>The tabpanel is considered a grouping for all content consisting of that tabpanel. </li><li>An accordion should manage the expanded/collapsed state of each tab by maintain its <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-expanded"><code>aria-expanded</code></a> state. </li><li>An accordion should manage the selected state of each tab by maintaining its <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-selected"><code>aria-selected</code></a> state. </li><li>An accordion should convey the visibility of each tabpanel by maintaining its <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-hidden"><code>aria-hidden</code></a> state. </li></ul> </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><p><a href="http://test.cita.uiuc.edu/aria/tabpanel/tabpanel2.php">Tabpanel Accordion</a></p></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="alert">
<h3 class="widget-name"><code>Alert</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">A message with important information</td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p>An alert (WAI-ARIA live region) does not require any keyboard shortcuts</p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><p> The widget has a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#alert"><code>alert</code></a>. It is a child of the role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#region"><code>region</code></a>. And it can have a child with role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#alertdialog"><code>alertdialog</code></a>. </p></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><p><a href="http://test.cita.uiuc.edu/aria/alert/alert1.php">Alert</a></p></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="autocomplete">
<h3 class="widget-name"><code>Auto Complete</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"><p>A textbox and an associated drop-down list of choices where the choices offered are filtered based on the information typed into the box. Typically, an icon associated with the textbox triggers the display of the drop-down list of choices. An editable auto-complete accepts text entry of choices that are not in the list. An example of an editable auto-complete is the URL field in the browsers. </p></td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li>With focus in an empty textbox, press <kbd>Down Arrow</kbd>, <kbd>Up Arrow</kbd>, <kbd>Alt+Down Arrow</kbd>, or <kbd>Alt+Up Arrow</kbd> to display the entire list of choices. Focus remains in the textbox and no choice is highlighted. </li><li>Press the <kbd>Down Arrow</kbd> to highlight the first choice in the list. </li><li>Press the <kbd>Down Arrow</kbd> and <kbd>Up Arrow</kbd> keys to highlight the desired choice in the list. </li><li>Note that the arrows will wrap through the textbox when the top or bottom of the list is reached. For example, pressing the down arrow when the last choice is highlighted will move focus back to the textbox, pressing down again will move focus to the first item in the list. Likewise, with focus in the textbox and the list displayed, pressing up arrow will move focus to the last item in the list. </li><li>When a choice is highlighted using the arrow keys, the highlighted choice is displayed in the textbox. </li><li>Press Enter to select the highlighted choice and close the drop-down list. This mimics the behavior of the HTML select element. </li><li>With focus in an empty textbox, type <strong>any letter</strong> key. If any of the available choices begin with the letter typed, those choices are displayed in a drop down. If the letter typed does not match any of the available choices the drop-down list is not displayed. </li><li>With focus in textbox with an existing value type <strong>additional letters.</strong> As the user types letters the list of choices is filtered so that only those that begin with the typed letters are displayed. </li><li>Until the user presses the arrow keys to highlight a particular choice, only the typed letters are displayed in the textbox. </li><li>In an editable auto-complete, if no choices match the letter(s) typed, the drop down list closes. </li><li>In a non-editable auto-complete, any letters that do not result in a match from the list are ignored, the drop down list of choices remains static until the user presses Escape to clear the text field, Backspace to remove some of the letters previously typed, or types an additional letter that results in a valid list of choices. </li><li>Navigation through the list of choices and display of the highlighted choice in the textbox works as described above.<br clear="none"/>
<em>Optional: When a choice is highlighted via arrow key navigation, the input cursor is left at the end of the typed entry and the highlighted choice is displayed in the textbox with the characters after the input cursor selected. Typing an additional character will remove the auto-completed portion and append the newly typed character to the end of the previously typed characters. The list will be filtered based on the additional character(s) typed.</em> </li><li>With focus in a textbox, press <kbd>Esc</kbd>
<ul><li>If there is no text in the textbox, pressing Escape closes the drop-down if it is displayed. </li><li>For an editable autocomplete that has text in the textbox that was both typed by the user and auto-completed by highlighting a choice using the keyboard, the auto-completed portion of the text is cleared and the user typed characters remain in the textbox. The drop-down list is closed. To completely clear the textbox contents the user must use the backspace key to remove the typed characters. This is how the Google search box in the Firefox UI works. <em>Recommend that pressing the Escape key again completely clears the textbox rather than relying on only the backspace key.</em> </li><li>For a non-editable auto-complete that has text in the textbox that was both typed by the user and auto-completed by highlighting a choice using the keyboard, pressing escape closes the drop-down list and leaves the current choice in the textbox. </li><li>For an editable or non-editable auto complete with text in the textbox that was typed by the user and the mouse is highlighting a choice in the drop down (keyboard navigation was NOT used), pressing escape closes the drop down and leaves the typed text displayed in the text box. Need to consider if pressing escape again should clear the typed text. The user must press the down arrow or alt+down arrow or click the associated icon to invoke the drop-down list of choices again. </li></ul>
</li><li>Moving focus out of an empty auto complete field where a value is required should either invoke an error or if a default value was initially assigned, reset the value to the default value. </li><li>Moving focus out of an auto complete field that does not contain a valid entry should either invoke an error or if a default value was initially assigned, reset the value to the default value. </li></ul>
<p class="note">It is good practice to limit the number of matching items in the drop down to a reasonable number. The reasonable number is determined by the task at hand. A list of the 50 US States is probably reasonable, but a list containing all of the office numbers in a building is probably not appropriate. </p>
</td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><p> The widget has a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#combobox"><code>combobox</code></a>, and its parent role is <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#input"><code>input</code></a>. It has a child with role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#textbox"><code>textbox</code></a>. The property <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-autocomplete"><code>aria-autocomplete</code></a> indicates whether user input completion suggestions are provided. </p></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><a href="http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/_autoComplete.html" title="http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/_autoComplete.html" rel="nofollow">Dojo autocomplete</a></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="button">
<h3 class="widget-name"><code>Button</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#button"><code>button</code></a> widgets allow for user-triggered actions, and they are most often used for discrete, atomic actions. Buttons support the optional state pressed. Buttons with this state present are toggle buttons. When pressed is "true" the button is depressed, when pressed is "false" it is not depressed.</td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p>With focus on the button, pressing <kbd>Space</kbd> or Enter keys executes the action for that button.</p>
<ul><li>If the button activation closes the containing entity or launches another entity, then focus moves to the newly opened entity. </li><li>If the button activation does not close or dismiss the containing entity, then focus remains on the button. An example might be an Apply or Recalculate button. </li></ul></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><ul><li> The button receives a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#button"><code>button</code></a>. </li><li>The button description receives the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> property. </li><li> When the action associated with a button is unavailable, the button displays in a <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-disabled"><code>aria-disabled</code></a> state. </li></ul></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><p><a href="http://www.mozilla.org/access/dhtml/button">XHTML button</a></p></td></tr></tbody></table>
<hr/>
</div>
<div class="widget" id="checkbox">
<h3 class="widget-name"><code>Check Box</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">A widget that has three possible values: true, false, or mixed.
<p>Many checkboxes do not use the "mixed" value, and thus are effectively boolean checkboxes. However, the aria-checked state supports the mixed value to support cases such as installers where an option has been partially installed. </p></td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p>Two-State Check Box
</p>
<ul><li><kbd>Space</kbd> key toggles the selection, checking or unchecking the box. </li></ul>
<p>Three-State Check Box
</p>
<ul><li>If not checked, <kbd>Space</kbd> checks the check box. </li><li>If checked, <kbd>Space</kbd> unchecks the check box.</li><li>If partially checked, <kbd>Space</kbd> unchecks the check box. </li></ul></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><ul><li>The checkbox should have a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#checkbox"><code>checkbox</code></a>. </li><li>If checked it should have the state <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-checked"><code>aria-checked</code></a>="true". </li><li>If not checked it should have the state <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-checked"><code>aria-checked</code></a>="false". </li><li>If partially checked, it should have the state <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-checked"><code>aria-checked</code></a>="mixed".</li><li>If you use an image to render the state of a checkbox, it should not appear in the accessibility API mapping. This can be accomplished using CSS to render it or setting a role of presentation on the image. </li><li>Put the checkbox in the tab order, such as by setting its <code>tabindex="0"</code>. </li><li>Checkboxes having a logical grouping should be children of a DOM element whose role is <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#group"><code>group</code></a>. </li><li>The group should assign a label that is visible and referenced through the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> property set to the ID of the label. </li><li>Use an <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-describedby"><code>aria-describedby</code></a> property to add additional help information to the checkbox or grouping. </li></ul></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Examples: </td><td class="widget-example" rowspan="1" colspan="1"><ul><li><a href="http://codetalks.org/source/widgets/checkbox/checkbox-tristate.html" target="_blank">Tri-State Checkbox</a></li><li><a href="http://codetalks.org/source/widgets/checkbox/checkbox.html">Two-State checkbox</a></li><li><a href="http://codetalks.org/source/widgets/checkbox/checkbox1.html">Two-State checkbox using CSS for image styling to remove images from accessibility tree as would be expected on the desktop. This example illustrates how a group role is used to group the checkboxes.</a></li><li><a href="http://codetalks.org/source/widgets/checkbox/checkbox2.html">Two-State checkbox using role="presentation" on images to remove images them from the accessibility tree as would be expected on the desktop. This example illustrates how a group role is used.</a></li></ul></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="combobox">
<h3 class="widget-name"><code>Combo Box</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">A combo box enables the user to type in a field and at the same time chose a predefined value from a list. By using the keyboard the user can select an item from the list. After selection she will be able to type further characters in the field.</td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li><kbd>Enter</kbd> selects an entry in the list if it was opened </li><li><kbd>Left Arrow</kbd> or <kbd>Right Arrow</kbd> move the caret </li><li><kbd>Up Arrow</kbd> and <kbd>Down Arrow</kbd> moves focus up and down the list. As focus moves inside the dropdown list, the edit field is updated.</li><li><kbd>Page Up</kbd>/<kbd>Page Down</kbd> selects the next/previous pages item depending on the lists size </li><li><kbd>Alt+Up Arrow</kbd> opens and closes the list. </li><li><kbd>Alt+Down Arrow</kbd> opens and closes the list. </li><li><kbd>Esc</kbd> closes the dropdown list, returns focus to the edit field, and does not change the current selection.</li><li><kbd>Typing a letter (printable character) key</kbd> moves focus to the next instance of a visible node whose title begins with that printable letter.</li></ul></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1">A combo box is a combination of text field, which may be editable, a drop button to choose an item to place in the combo box, and a displayable list of items all wrapped in the form of a single widget. Like text fields a combobox should be labeled to determine the essence of the widget. Keyboard focus within the widget must be managed by the widget. Comboboxes are used extensively in graphical user interfaces and the design pattern for the widget should be semantically correct.
<ul><li>The container element should that wraps the combobox must have a role of "combobox." </li><li>The first element within the combobox should be an input text field and is responsible for managing the keyboard focus between the textfield and the list as well as displaying the list. The textfield should be in the tab order. If you create a textfield without using a standard HTML textfield form control then you must ensure that it is in the tab order. </li><li>If the textfield is not editable it must have have aria-readonly="true." </li><li>The next element should be an html <button> or another html element with a role of "button". This button should be in the tab order and be responsible for opening the list. </li><li>The next element constitute with a role="list" representing the drop down list and it should managed the keyboard navigation between each list item and back to the textfield if necessary. </li><li>Each item in the list should have a role="listitem". Listitems should not be in the tab order. </li><li>You should provide a label which labels the combobox by referencing the textfield in the combobox. You can use an aria-label to associate this label with the combobox or you may use the HTML <label> element and its for attribute to reference the textfield. </li></ul></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><ul><li><a href="http://codetalks.org/source/widgets/combobox/combo-editable.html" target="_blank">Editable HTML ComboBox</a></li><li><a href="http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/_autoComplete.html?testWidget=dijit.form.ComboBox">Dojo nightly build combobox</a></li><li><a href="http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/_autoComplete.html?testWidget=dijit.form.FilteringSelect">Dojo nightly build combobox with autocomplete</a></li></ul> </td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="datepicker">
<h3 class="widget-name"><code>Date Picker</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">The DatePicker
widget allows the user to select a date, multiple dates or date ranges.
The DatePicker should at least show one month. All navigation that is described
below depends on the application. If no range selection is possible this interaction
can be ignored. Also navigation to the past might be optional. Each week might be
labeled with the corresponding calendar week number.
<p>
As a general rule the actual calendar portion of the date picker should follow a table
structure where days of the week and calendar day numbers are layed out in table cells. This
provides context so an assistive technology can render the day of the week; its corresponding
numeric calendar day, and week number if necessary. Consequently, it is best to start
with an HTML table and apply WAI-ARIA semantics for a grid. However, should the author
wish to uses a div or span to represent the cells then the DOM structure for a table should be
duplicated with rows marked with role="row."
</p>
</td></tr><tr><td class="widget-keyboard-head" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1">
<p>
Keyboard navigation on days that are not included the currently displayed month
should move to the month automatically and lead to the day in the next or previous
month.
</p>
<ul><li><kbd>Tab</kbd> - Like other widgets, the date picker widget receives focus by tabbing into it. Once focus is received, focus is repositioned on today's date in a grid of days and weeks. A second tab will take the user out of the date picker widget. Focus initially is placed on today's date.</li><li><kbd>Shift+Tab</kbd> - reverses the direction of the tab order. Once in the widget, a Shift+Tab will take the user to the previous focusable element in the tab order.</li><li><kbd>Up Arrow</kbd> and <kbd>Down Arrow</kbd> - goes to the same day of the week in the previous or next week respectively. If the user advances past the end of the month they continue into the next or previous month as appropriate.</li><li><kbd>Left Arrow</kbd> and <kbd>Right Arrow</kbd> - advances one day to the next, also in a continuum. Visually focus is moved from day to day and wraps from row to row in a grid of days and weeks.</li><li><kbd>Control+Page Up</kbd> - Moves to the same date in the previous year.</li><li><kbd>Control+Page Down</kbd> - Moves to the same date in the next year.</li><li><kbd>Space</kbd> -
<ul><li>Singleton Mode: acts as a toggle either selecting or deselecting the date.</li><li>Contiguous Mode: Similar to selecting a range of text. <kbd>Space</kbd> selects the first date. <kbd>Shift+Arrow</kbd>s add to the selection. Pressing <kbd>Space</kbd> again deselects the previous selections and selects the current focused date.</li><li>Non-Contiguous Mode: <kbd>Space</kbd> may be used to select multiple non-contiguous dates.</li></ul>
</li><li><kbd>Home</kbd> - Moves to the first day of the current month.</li><li><kbd>End</kbd> - Moves to the last day of the current month.</li><li><kbd>Page Up</kbd> - Moves to the same date in the previous month.</li><li><kbd>Page Down</kbd> - Moves to the same date in the next month.</li><li><kbd>Enter</kbd> - Submits the form.</li><li><kbd>Esc</kbd> - in the case of a popup date picker, closes the widget without any action.</li></ul>
<p class="note">Navigation into the past is optional</p>
<p class="note">
Do not implement keyboard navigation schemes that would place more than one calendar
day in the tab order at any time as this impacts the usability of keyboard navigation.
For example, using HTML anchors for the gridcells places them all in the tab order impacting
the usability of keyboard navigation.</p>
</td></tr><tr><td class="widget-keyboard-head" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-keyboard" rowspan="1" colspan="1">
<ul><li>The current month should have a label representing the month and year. This
should have a role header but is not essential. This "label" should have a unique ID.</li><li>If the author would like to ensure that a label is announced by a screen reader, as the label changes, the label should
include live region properties: aria-live="assertive" and aria-atomic="true"</li><li>The container for the day of week headers and numeric days of the week should have a role of grid</li><li>The grid should have an aria-labelledby property with a value equivalent to the id of the label for the grid</li><li>Each name for the day of the week should have a role columnheader and
they should not be navigable via the keyboard.</li><li>Each numeric day of the week should have the role gridcell.</li><li>When a day is selected it should have aria-selected="true" otherwise it should be set to "false" or removed.</li><li>Changes in aria states, identified here, as well as focus, should be clearly styled to show the user where their point of regard is and what days are selected.</li></ul>
When the datepicker is active a calender day of the week should always have focus. This can be achieved
by setting the tabindex on that day as appropriate and then using script to give it focus. Alternatively,
the grid container could set aria-activedescendant to the id of the currently focused gridcell. Keep
in mind that older browsers may not support aria-activedescendant. </td></tr><tr><td class="widget-keyboard-head" rowspan="1" colspan="1">Example: </td><td class="widget-keyboard" rowspan="1" colspan="1">
<a href="http://codetalks.org/source/widgets/datepicker/datepicker.sample.html" target="_blank">HTML DatePicker</a></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="dialog_modal">
<h3 class="widget-name"><code> Dialog (Modal) </code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"><p>A dialog is a small application window that sits above the application and is designed to interrupt the current processing of an application in order to prompt the user to enter information or require a response (<a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#dialog"><code>dialog</code></a>). A modal dialog is a dialog that takes and holds focus until the dialog is closed or submitted. </p></td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p>Keyboard navigation within a modal dialog includes these aspects:</p>
<ul><li><kbd>Enter</kbd> If the purpose of the dialog is to gather information, the dialog should have a mechanism to submit the data gathered usually via a keyboard accessible button. The Enter key should serve as the default submit action. </li><li><kbd>Esc</kbd> There should be a method to close the dialog without taking any action. This could be implemented via a cancel button which is keyboard accessible. It is recommended that a dialog also be cancelled by pressing the escape key with focus on any item. </li><li><kbd>Tab</kbd> Focus must be held within the dialog until it is cancelled or submitted. As the user presses tab to move within items in the dialog, pressing tab with focus on the last focusable item in the dialog will move focus back to the first focusable item in the dialog. </li><li><kbd>Shift+Tab</kbd> Likewise, if the user is shift-tabbing through elements in the dialog, pressing shift-tab with focus on the first focusable item in the dialog will move focus to the last item in the dialog. </li></ul>
<p><strong>Notes:</strong> </p>
<ul><li>If the current focus item has escape key behavior, the press of the escape will be handled by the current item and the user may have to press escape an additional time to close the dialog. </li><li>Even if the user clicks outside of the dialog on the application which invoked the dialog, focus remains in the dialog. </li><li>Because the dialog is modal and the user can not interact with the invoking application while the dialog is displayed, there is not a requirement to make the dialog moveable via the mouse although this behavior is recommended. </li><li>When the dialog is closed or cancelled focus should return to the element in the application which had focus before the dialog is invoked. This is usually the control which opened the dialog. </li><li>When a modal dialog opens focus goes to the first focusable item in the dialog. Determining the first focusable item must take into account elements which receive focus by default (form fields and links) as well as items which may have a tabindex attribute with a positive value. If there is no focusable item in the dialog, focus is placed on the dialog container element. </li></ul>
</td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><p>A dialog has a role of aria-dialog, with a parent of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#window"><code>window</code></a> and child of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#alertdialog"><code>alertdialog</code></a>. In addition to some global states and properties, it can have the state <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-expanded"><code>aria-expanded</code> (state)</a>.</p>
<p>The dialog box title is provided by <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-label"><code>aria-label</code></a> or <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> property.</p></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><ul><li><a href="http://download.dojotoolkit.org/release-1.2.3/dojo-release-1.2.3/dijit/tests/test_Dialog.html" title="http://download.dojotoolkit.org/release-1.2.3/dojo-release-1.2.3/dijit/tests/test_Dialog.html" rel="nofollow">Dojo 1.2.3 Release</a></li><li><a href="http://developer.yahoo.com/yui/examples/container/container-ariaplugin_clean.html" title="http://developer.yahoo.com/yui/examples/container/container-ariaplugin_clean.html" rel="nofollow">YUI dialogs -- use first two dialog buttons</a></li></ul> </td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="dialog_nonmodal">
<h3 class="widget-name"><code> Dialog (Non-Modal) </code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"><p>A dialog is a small application window that sits above the application and is designed to interrupt the current processing of an application in order to prompt the user to enter information or require a response (<a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#dialog"><code>dialog</code></a>). </p>
<p>A non-modal dialog is one which is displayed and focusable at the same time as the application which invoked it. Also like the modal dialog, focus via the tab and shift-tab key must be maintained within the dialog. However, a non-modal dialog should have a keyboard mechanism to return focus to the application while leaving the dialog open. </p></td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li><kbd>Esc</kbd> cancels the dialog without taking any action </li><li><kbd>Enter</kbd> submits any data gathered in the dialog. </li><li><kbd>F6</kbd> is the recommended key to move focus between the application and an open non-model dialog. </li></ul>
<p><strong>Notes:</strong></p>
<ul><li>The mouse user may click on either the application or the dialog to change focus between the two. </li><li>In a Web application the non-modal dialog is usually always displayed above the application page, rather than in a separate browser window but that is not a requirement. </li><li>This dialog box is dragable by the mouse user and an equivalent behavior (<a href="#draganddrop">Drag & Drop</a>) should be offered to the keyboard only user. </li></ul> </td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1">See Dialog (Modal).</td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"> </td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="dialog_tooltip">
<h3 class="widget-name"><code> Dialog (Tooltip) </code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p> </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"> </td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="draganddrop">
<h3 class="widget-name"><code> Drag & Drop </code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p> </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><ul><li><a href="http://codetalks.org/source/widgets/draganddrop/draganddrop1.html" title="http://codetalks.org/source/widgets/draganddrop/draganddrop1.html" rel="nofollow">Tic tac toe</a></li><li><a href="http://codetalks.org/source/widgets/draganddrop/draganddrop2.html" title="http://codetalks.org/source/widgets/draganddrop/draganddrop2.html" rel="nofollow">Slide show</a></li></ul></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="grid">
<h3 class="widget-name"><code>Grid (Simple Data Tables)</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"><p>Unlike an HTML table, which is display only, a grid presents tabular data in rows and columns that are navigable via the keyboard, and allows for cells to be selected in the grid. The user moves focus through each data cell having a role of gridcell, through the use of arrow keys. Each column has an associated element with the role columnheader. Data cells carry the role gridcell. A grid may also contain hierarchical rows. In this case the role of the grid container should be treegrid rather than grid. This design pattern, and corresponding examples, reflect a basic two-dimensional grid without grids embedded within a gridcell. </p>
<p>WAI-ARIA grids are not meant to replace the full functionality of a table. Consequently, there may be instances when you need to have cells span multiple columns or rows for which WAI-ARIA does not provide semantics. This can be achieved by overlaying grid and gridcell semantics onto an HTML table to provide appropriate column and row span semantics. Authors should ensure that headers are properly marked using a native header tag or WAI-ARIA columnheader or rowheader semantics. The connection between gridcell and header can be achieved using standard HTML attribute header. In HTML, multiple column or row headers for one data cell can be identified through the use of a space separated list of header ids in the headers attribute. </p>
<p>If a WAI-ARIA grid is not overlayed on a table, authors should mark the rowheader, columnheader, and gridcell roles on the appropriate elements. For gridcells that span multiple columns or have multiple headers, the author should apply the aria-labelledby property to the cell to the space delimited list of corresponding row or column header element IDs. Gridcells that span multiple rows or columns should be reflected in the keyboard navigation.</p>
<p>If a grid contains editable data, it should have both an editable mode and a navigation mode.</p></td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p>There are two modes of keyboard interaction: </p>
<ul><li>Navigation Mode (Read-Only) is the default mode, and allows quick and intuitive navigation around the grid.
<ul><li>The first <kbd>Tab</kbd> into the grid moves focus to the first cell of the first row. </li><li>The second <kbd>Tab</kbd> leaves the grid and moves focus to the next tabbable item on the page. </li><li>Subsequent <kbd>Tab</kbd>: Once focus has been moved inside the grid, subsequent tab presses that re-enter the grid shall return focus to the cell that last held focus. </li><li>Right/Left arrow keys navigate through the columns. There is no wrap at the end or beginning of columns. </li><li>Up/Down arrow keys navigate through the rows. There is no wrap at the first or last rows. </li><li><kbd>Home</kbd> moves the focus to the first cell of the current row. </li><li><kbd>End</kbd> moves the focus to the last cell in the current row. </li><li><kbd>Page Up</kbd> moves the focus to the first cell in the current column </li><li><kbd>Page Down</kbd> moves the focus to the last cell in the current column </li><li>Selecting Cells
<ul><li><kbd>Ctrl+Space</kbd> selects the current column. </li><li><kbd>Shift+Space</kbd> selects the current row. </li><li><kbd>Ctrl+A</kbd> selects the entire grid. </li><li><kbd>Shift+Arrow</kbd> selects contiguous cells. </li><li><kbd>Shift+F8</kbd> Allows additional cells to be added to a previous selection to accomplish non-contiguous selection. </li></ul>
<p class="note">See <a href="#aria_ex_widget">Global Recommendations</a> for information on copy and paste. </p>
</li></ul>
</li><li>Actionable Mode (Interactive) allows the interaction with other objects that might be found in the grid cells such as edit fields, links, etc.
<ul><li><kbd>F2</kbd> pressed anywhere inside the grid will enter Actionable Mode. Focus will not be moved. </li><li><kbd>Enter</kbd> pressed while focus is on an actionable item will enter Actionable Mode. Focus will remain on the actionable item that has focus. </li><li>Optionally, alphanumeric keys pressed while focus is on an actionable item will enter Actionable Mode. Focus will remain on the actionable item that has focus. </li><li>Using grid as an example, by default, pressing <kbd>Esc</kbd> anywhere inside the grid will mean exiting Actionable mode (by which the user may enter text or perform an action to complete a operation) and a return to Navigation Mode (where the user is allowed to move focus among elements). If a widget is in the current grid cell that also uses the <kbd>Esc</kbd> key, then it should cancel the event propagation. A subsequent press of the <kbd>Esc</kbd> key will return focus to the parent widget.</li><li><kbd>Tab</kbd> will move to the next actionable (tabbable) item in the grid and stay within the grid wrapping at the bottom. In this mode each tabbable object in each cell of the grid can be reached with the tab key. If multiple tabbable items are located inside a single grid cell, the tab will stop at each one. When the last tabbable item in a cell is reached the next tab will move to the next tabbable item in the grid, wrapping at the last tabbable item in the grid. </li><li><kbd>Shift+Tab</kbd> moves to the previous actionable (tabbable) item in the grid and stays within the grid, wrapping at the top. </li></ul>
</li></ul>
<p class="note">It is recommended the developer use different styling for the selection when the grid is not focused (hint: non-active selection is often shown with a lighter background color). </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><ul><li>The DOM representation of the grid should follow the HTML DOM structure, although it will be possible to use <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> to add a row or table cell. This is an edge case and may not be supported by assistive technologies. </li><li>The grid container should have a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#grid"><code>grid</code></a>. </li><li>The data cells should have a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#gridcell"><code>gridcell</code></a>.</li><li>Each row should be clearly marked using a <code><TR></code> from HTML or by using a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#row"><code>row</code></a>.</li><li>Column and row headers may be represented by a <code><TH></code> if you are using an HTML table or you may explicitly use an aria role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#columnheader"><code>columnheader</code></a> and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#rowheader"><code>rowheader</code></a> respectively.</li><li>Whenever a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#gridcell"><code>gridcell</code></a> is selected, set <code>aria-selected="true"</code>. </li><li>Whenever a row is selected, set its role to <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#row"><code>row</code></a> and its <code>aria-selected="true"</code> allowing an AT to quickly determine that the entire row is selected. </li><li>By default a grid is considered to be editable, meaning all gridcells are editable. Should you want to make a grid read-only, set <code>aria-readonly="true"</code> on the document element having a <code>role="grid"</code>. This will make all grid cells read-only. To override the read-only status on an individual grid cell, set its <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-readonly"><code>aria-readonly</code></a> property to false. </li></ul></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1">
<ul><li><a href="http://codetalks.org/source/widgets/grid/grid.sample.html">Simple Grid</a></li><li><a href="http://codetalks.org/source/widgets/datepicker/datepicker.sample.html" target="_blank">HTML Grid as part of a date picker</a></li><li><a href="http://codetalks.org/source/widgets/grid/grid.html">HTML grid overlaying a table in an application with a menu</a></li></ul>
</td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="landmarks">
<h3 class="widget-name"><code> Landmark Navigation </code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p> </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><ul><li> <a href="http://test.cita.uiuc.edu/aria/nav/nav1.php" title="http://test.cita.uiuc.edu/aria/nav/nav1.php" rel="nofollow">Illinois Navigation Example</a></li><li><a href="http://juicystudio.com/article/examining-wai-aria-document-andmark-roles.php" title="http://juicystudio.com/article/examining-wai-aria-document-andmark-roles.php" rel="nofollow">Juicy Studio</a> -- real world example </li><li> <a href="http://wiki.codetalks.org/wiki/index.php/Main_Page" rel="nofollow">Codetalks.org</a> -- another real world example </li></ul> <p> </p></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="link">
<h3 class="widget-name"><code>Link</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">The <code>Link</code> widget provides an interactive reference to a resource either locally in the application or to an external resource. </td></tr><tr><td class="widget-keyboard-head" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p>The Link is in the tab chain defined with the tabindex attribute. </p>
<ul><li><kbd>Tab</kbd> moves focus to the Link. A second tab moves focus to the next focusable item. </li><li><kbd>Space</kbd> or <kbd>Enter</kbd> executes the link. </li><li><kbd>Shift+F10</kbd> is used to bring up an associated Popup Menu. </li></ul></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1">Set a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#link"><code>link</code></a> on the element containing the text of the link.</td></tr><tr><td class="widget-keyboard-head" rowspan="1" colspan="1">Example: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li><a href="http://codetalks.org/source/widgets/link/link.html" target="_blank">HTML Link 1</a> </li><li><a href="http://codetalks.org/source/widgets/link/link.sample.html" target="_blank">HTML Link 2</a> </li></ul>
</td></tr></tbody></table>
<p> </p>
</div>
<hr/>
<div class="widget" id="listbox_div">
<h3 class="widget-name" id="listbox"><code>Listbox</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">A widget that allows the user to select one or more items from a list of choices. (<a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listbox"><code>listbox</code></a>). </td></tr><tr><td class="widget-keyboard-head" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li><kbd>Tab</kbd>: When a list is tabbed to, select the first item if nothing else is already selected. A second tab will take the user out of the widget to the next tab stop on the page. </li><li>Up/down arrows navigate up and down the list. </li><li><kbd>Shift+Up Arrow</kbd> and <kbd>Shift+Down Arrow</kbd> move and extend the selection. </li><li>Typing letter or several letters to navigate (same letter goes to each item starting with that, different letters go to first item starting with that entire string). </li><li><kbd>Shift+F10</kbd>: If the current item has an associated context menu, then this key combination will launch that menu. </li><li><strong>Selection</strong>
<ul><li>Checkbox - <kbd>Space</kbd> toggles <a href="#checkbox">checkboxes</a>, if the list items are checkable </li><li>Selectable List Items
<ul><li><kbd>Space</kbd> acts as a toggle to select and deselect the current item. If previous items have been selected, it also deselects them and selects the current item. </li><li><kbd>Shift+Space</kbd> selects contiguous items from the last selected item to the current item. </li><li><kbd>Ctrl+Arrow</kbd> moves without selecting. </li><li><kbd>Ctrl+Space</kbd> selects non-contiguous items and adds the current selected item to all previously selected items. </li><li><kbd>Ctrl+A</kbd> - It is recommended a checkbox, link or other method be used to select all. The <kbd>Ctrl+A</kbd> key could be used to provide the shortcut key.</li></ul>
</li></ul>
</li></ul>
<p class="note">It is recommended the developer use different styling for the selection when the list is not focused (hint: non-active selection is often shown with a lighter background color). </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><ul><li>The listbox container has a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listbox"><code>listbox</code></a>.</li><li>Each entry in the listbox should have a role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#option"><code>option</code></a> and should be DOM children of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#listbox"><code>listbox</code></a>.</li><li>If is not a DOM child of listbox, then it should be referenced in the listbox by <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a>.</li><li>If all items in the listbox are not DOM children of the listbox, then set their <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-setsize"><code>aria-setsize</code></a> and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-posinset"><code>aria-posinset</code></a> accordingly; otherwise, this information cannot be computed for context by the user agent.</li><li>If the listbox is not part of another widget, then it should have a visible <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-label"><code>aria-label</code></a> referenced on the listbox by <br clear="none"/>
<a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a>.</li><li>Each selected list item should have <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-selected"><code>aria-selected</code></a>="true".</li></ul></td></tr><tr><td class="widget-keyboard-head" rowspan="1" colspan="1">Example: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li><a title="http://codetalks.org/source/widgets/listbox/listbox.html" href="http://codetalks.org/source/widgets/listbox/listbox.html" rel="nofollow">Single select listbox</a></li><li><a title="http://codetalks.org/source/widgets/listbox/listbox-owner.html" href="http://codetalks.org/source/widgets/listbox/listbox-owner.html" rel="nofollow">Listbox in an iframe</a></li></ul></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="mediaplayer"><h3 class="widget-name"><code>Media Player</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p> </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"> </td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="menu"><h3 class="widget-name"><code>Menu</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">A menu type of widget that offers the user a list of choices. It is often a list of links to important sections of a document or a site. The menu role is appropriate when the list of links is presented in a manner similar to a menu on a desktop application. A menubar is also considered a form of menu. A menu should manage the focus of its descendants. </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li>If a menu bar item has focus and the menu is not open, then:
<ul><li><kbd>Enter</kbd>, <kbd>Space</kbd>, or the up or down arrow keys opens the menu and places focus on the first menu item in the opened menu or child menu bar. </li><li>Left or right arrow keys move focus to the adjacent menu bar item. </li></ul>
</li><li>When a menu is open and focus is on a menu item in that open menu, then
<ul><li><kbd>Enter</kbd> or <kbd>Space</kbd> invokes that menu action (which may be to open a submenu). </li><li><kbd>Up Arrow</kbd> or <kbd>Down Arrow</kbd> keys cycle focus through the items in that menu. </li><li><kbd>Esc</kbd> closes the open menu or submenu and returns focus to the parent menu item. </li><li>If the menu item with focus has a submenu, pressing <kbd>Enter</kbd>, <kbd>Space</kbd>, or the right arrow key opens the submenu and puts focus on the first submenu item. </li></ul>
</li><li>When a submenu is open and focus is on a menu item in that submenu:
<ul><li><kbd>Up Arrow</kbd> or <kbd>Down Arrow</kbd> keys cycle through the submenu items (behaves the same as open menu). </li><li><kbd>Esc</kbd> or the <kbd>Left Arrow</kbd> key closes the submenu and returns focus to the parent menu item. </li></ul>
</li><li>Typing a letter (printable character) key moves focus to the next instance of a visible node whose title begins with that printable letter. </li><li>First item in menu bar should be in the tab order (tabindex=0). </li><li>Disabled menu items receive focus but have no action when <kbd>Enter</kbd> or <kbd>Left Arrow</kbd>/<kbd>Right Arrow</kbd> is pressed. It is important that the state of the menu item be clearly communicated to the user. </li><li>Tabbing out of the menu component closes any open menus. </li><li>With focus on a menu item and a sub menu opened via mouse behavior, pressing down arrow moves focus to the first item in the sub menu. </li><li>With focus on a menu item and a sub menu opened via mouse behavior, pressing up arrow moves focus to the last item in the sub menu. </li><li>With focus on a submenu item, the user must use arrows or the <kbd>Esc</kbd> key to progressively close submenus and move up to the parent menu item(s). </li><li>At the top level, <kbd>Esc</kbd> key closes any sub menus and keeps focus at the top level menu. </li></ul></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><ul><li>A menu is a container of options. The container may have a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menu"><code>menu</code></a> or <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menubar"><code>menubar</code></a> depending on your implementation. A menubar usually remains visible horizontally. </li><li>The menu will contain elements menuitems with roles: <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menuitem"><code>menuitem</code></a>, <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menuitemcheckbox"><code>menuitemcheckbox</code></a>, or <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menuitemradio"><code>menuitemradio</code></a> depending on your implementation. </li><li>If activation of your menuitem produces a popup menu, then the menuitem should have <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-haspopup"><code>aria-haspopup</code></a> set to the ID of the corresponding menu to allow the assistive technology to follow the menu hierarchy and assist the user in determining context during menu navigation. </li><li><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menuitemcheckbox"><code>menuitemcheckbox</code></a> and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menuitemradio"><code>menuitemradio</code></a> should set <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-checked"><code>aria-checked</code></a> to "true" when checked. </li><li>Menu focus should be managed by the menu using tabindex or <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-activedescendant"><code>aria-activedescendant</code></a></li><li>A menuitem within a menu or menubar may appear in the tab order only if it is not within a popup menu. </li><li>Each menuitem should be a child of its menu or menubar in the DOM tree. </li><li>A menuitem that is not a DOM child of the menu or menubar must be referenced by the menu or menubar using <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-owns"><code>aria-owns</code></a> and will appear in order at the end of the list of menuitems. Therefore, authors should ensure that navigation to each menu item follows this order. </li></ul></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><a href="http://codetalks.org/source/widgets/grid/grid.html">menu bar and grid</a></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="menubutton"><h3 class="widget-name"><code>Menu Button</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p> </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><p><a href="http://codetalks.org/source/widgets/grid/grid.html" title="http://codetalks.org/source/widgets/grid/grid.html" rel="nofollow">Menubar 1</a></p></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="popupmenu"><h3 class="widget-name"><code>Popup Menu</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p> </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><a href="http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/test_Menu.html" title="http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/test_Menu.html" rel="nofollow">dojo nightly build - popup menu</a></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="popuphelp"><h3 class="widget-name"><code>Popup Help (aka Bubble Help)</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p> </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"> </td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="radiobutton"><h3 class="widget-name"><code>Radio Button</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">An option in single-select list</td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li><kbd>Tab</kbd> key will enter the radio group.
<ul><li>When tabbing into a group focus goes to the selected button. If none is selected it goes to the top unless you are shift tabbing, in which case, focus goes to the bottom.</li><li>When tabbing into the group a second time, you should return to the point of previous focus (which should be the one that is checked) </li><li>Pressing <kbd>Tab</kbd> again exits the radio group. </li></ul>
</li><li><kbd>Up Arrow</kbd> and <kbd>Left Arrow</kbd> move forward in the group </li><li><kbd>Down arrow</kbd> and <kbd>Right Arrow</kbd> move backwards in the group. When the arrow moves focus, the button is selected.
</li><li><kbd>Down Arrow</kbd> at bottom should wrap to top </li><li><kbd>Up Arrow</kbd> at top should wrap to bottom </li><li><kbd>Space</kbd> selects the radio button with focus and de-selects other radio buttons in the group. </li><li><kbd>Ctrl+Arrow</kbd> moves through the options without updating content or selecting the button. </li></ul> </td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1">The individual option uses the role list <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#radio"><code>radio</code></a>. It is a member of a group of radio controls, <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#radiogroup"><code>radiogroup</code></a>. </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><ul><li> <a href="http://codetalks.org/source/widgets/radio/radio1.html" title="http://codetalks.org/source/widgets/radio/radio1.html" rel="nofollow">Radio Example using CSS Background Images</a></li><li> <a href="http://codetalks.org/source/widgets/radio/radio2.html" title="http://codetalks.org/source/widgets/radio/radio2.html" rel="nofollow">Radio Example using IMG Element</a></li><li> <a href="http://codetalks.org/source/widgets/radio/radio3.html" title="http://codetalks.org/source/widgets/radio/radio3.html" rel="nofollow">Radio Example using aria-activedescendant Property</a></li></ul></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="richtext"><h3 class="widget-name"><code>Rich Text Editor</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">Input control that accepts free-form text as its value. </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li>The edit control is provided by the browser; it provides the keyboard support for navigating, adding, removing and selecting text, so that behavior is not defined by the rich internet application. </li><li>The browser should also provide a keyboard mechanism for navigating into and out of the edit control. Within most browsers the edit control is put into the tab order of the page and can be navigated into, out of, and through using the tab and shift-tab keys like any standard form control. </li><li>A rich text editor widget needs to provide a user interface for interacting with the browser provided edit control. Interaction between the user interface and editor is defined here assuming that a toolbar is used. </li><li><kbd>Tab</kbd> and <kbd>Shift+Tab</kbd> - If not provided by the browser, the rich text editor widget must provide a keyboard mechanism to move into and out of the edit control. Tab and shift-tab are the recommended keystrokes. The toolbar or other user interface component associated with the editor is placed in the tab order immediately before the editor. To set an attribute on text within the edit control the user sets focus into the edit control, moves the insertion point, selects text and presses shift-tab to move focus from the editor back to the toolbar. The user navigates through the toolbar (see toolbar behavior) to a desired attribute and invokes that attribute. When an attribute is invoked, that attribute is applied to the selected text in the editor and focus moves back into the editor at the previous insertion point with the selection intact. </li><li><strong>Options:</strong>
<ul><li>Rather than using shift-tab to move focus from within the editor to the toolbar, another key combination could be used (alt-up arrow, ctrl-shift-letter, etc.). This would eliminate the need to put the user interface control (in this example a toolbar) into the tab order immediately before the editor component. However, there are drawbacks to using a different keystroke to navigate to the user interface:
<ol><li>It is not as "discoverable" as relying on the standard tab/shift-tab behavior; </li><li>It is difficult to find key combinations which are not already captured by the browser or assistive technology. </li><li>Focus could stay within the toolbar after the user invokes an attribute. The user would then have to press an additional key to move focus back into the editor. This would allow multiple attributes to be set on the current selection without having to return back to the user interface but it would add an extra key sequence after setting just a single attribute. Requiring a keystroke to move focus back into the editor would also require modifying the toolbar behavior to intercept this keystroke and to know how to set focus back to the component (the editor) that the toolbar is associated with. </li></ol>
</li></ul>
</li></ul>
<p>Optionally, if the developer wishes to provide the ability to insert a tab into the document, it is recommended one of the following methods be used. </p>
<ul><li>Provide indent and outdent buttons in the menu. Keyboard shortcuts to the buttons should be <kbd>Ctrl+M</kbd> for indent and <kbd>Ctrl+Shift+M</kbd> for outdent. </li><li>Provide a button in the menu to toggle the use of <kbd>Tab</kbd> between the two modes. If this button is used, then <kbd>Ctrl+M</kbd> is recommended as a keyboard shortcut to toggle the button. </li></ul> <p> </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><span class="widget-description"> Uses the WAI-ARIA role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#textbox"><code>textbox</code></a></span></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"> </td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="slider">
<h3 class="widget-name"><code>Slider</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"> A slider is user input where the user selects a value from within a given range. Sliders typically have a button such that when moved will change the current value within the current range of the slider. The button must be keyboard accessible.
It is typically possible to add or subtract to the current value by using directional keys such as arrow keys. </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li><kbd>Right Arrow</kbd> and <kbd>Up Arrow</kbd> increase the value of the slider.</li><li><kbd>Left Arrow</kbd> and <kbd>Down Arrow</kbd> decrease the value of the slider.</li><li><kbd>Home</kbd> and <kbd>End</kbd> move to the minimum and maximum values of the slider.</li><li><kbd>Tab</kbd> into and out of the slider.</li><li><kbd>Page Up</kbd> and <kbd>Page Down</kbd> optionally increment or decrement the slider by a given amount.</li></ul>
<p class="note">Focus is placed on the slider. (The visual object that the mouse user would move, also known as the thumb.) </p>
<p class="note">Localization for right to left languages may wish to reverse the left and right arrows.</p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><p>The slider control uses the role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#slider"><code>slider</code></a> and the role as well as its states and properties must be applied to the element that has focus. The slider must support the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuenow"><code>aria-valuenow</code></a>, <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuemax"><code>aria-valuemax</code></a>, and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuemin"><code>aria-valuemin</code></a> properties. If the valuenow property should be provided in a more human readable form than a decimal, such as a day of the week, then the slider should provide that information using <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuetext"><code>aria-valuetext</code></a>. </p>
<p>Sliders should be labelled and a reference to the label should be provided using <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a>.</p></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><ul><li> <a href="http://codetalks.org/source/widgets/slider/simple-slider.html" title="http://codetalks.org/source/widgets/slider/simple-slider.html" rel="nofollow">Simple slider</a></li><li> <a href="http://codetalks.org/source/widgets/slider/pretty-slider-background-images.html" title="http://codetalks.org/source/widgets/slider/pretty-slider-background-images.html" rel="nofollow">Pretty slider</a></li><li> <a href="http://mindtrove.info/html/rating-tutorial.html" title="http://mindtrove.info/html/rating-tutorial.html" rel="nofollow">MINDTROVE Rating Widget</a></li><li> <a href="http://www.paciellogroup.com/blog/misc/ARIA/slider/" title="http://www.paciellogroup.com/blog/misc/ARIA/slider/" rel="nofollow">Paciello Group slider</a></li></ul>
<p>Please note that not all examples work in all browser and version combinations. For example, note the compatibility statement.</p></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="slidertwothumb">
<h3 class="widget-name"><code>Slider (Multi-Thumb)</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"> A multi-thumb slider is a slider with multiple user inputs designed to change the maximum and minimum range for an object it controls.</td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p>This range slider allows author to modify the maximum and minimum range of an object within an applications. Moving the thumb on either end allows the author to modify the corresponding maximum or minimum value of what it is controlling.</p>
<ul><li><kbd>Tab</kbd> to the first slider thumb.</li><li>Second <kbd>Tab</kbd> moves to next slider thumb..</li><li>Third <kbd>Tab</kbd> moves to the next slider thumb or if there are no more, it moves to the next tab stop on the page. </li><li><kbd>Shift+Tab</kbd> moves backwards through the tabs.</li><li>With focus on a thumb: Same as <a href="#slider">Slider</a> above.
<ul><li><kbd>Right Arrow</kbd> and <kbd>Up Arrow</kbd> increase the value of the slider constrained by the value of the other thumb. </li><li><kbd>Left Arrow</kbd> and <kbd>Down Arrow</kbd> decrease the value of the slider constrained by the value of the other thumb. </li><li><kbd>Home</kbd> and <kbd>End</kbd> move to the minimum and maximum values of the slider constrained by the value of the other thumb. </li><li><kbd>Page Up</kbd> and <kbd>Page Down</kbd> optionally increment or decrement the slider by a given amount, constrained by the value of the other thumb. </li></ul>
</li></ul>
<p class="note">Focus is placed on one of the thumbs of the slider.</p>
<p class="note">All thumbs are in the tab order.</p>
<p class="note">Localization for right to left languages may wish to reverse the left and right arrows.</p>
<p class="note">If the current value of a slider crosses over one of the other sliders, the tab order remains the same. Example. If a high range slider is moved so that its current value is below the current value of a low range slider, the thumb will visually appear to be before the low range slider. This should not change the tab order of the slider. </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><p>Each thumb uses the role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#slider"><code>slider</code></a> . The thumb must support the <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuenow"><code>aria-valuenow</code></a>, <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuemax"><code>aria-valuemax</code></a>, and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuemin"><code>aria-valuemin</code></a> properties. If the valuenow property should be provided in a more human readable form than a decimal, such as a day of the week, then the slider should provide that information using <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuetext"><code>aria-valuetext</code></a>. Each thumb should define a <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a> relationship between it and the opposing slider thumb as this will effect the corresponding <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuenow"><code>aria-valuenow</code></a>, <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuemax"><code>aria-valuemax</code></a>, and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuemin"><code>aria-valuemin</code></a> properties. Each slider thumb should define a <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a> relationship between the thumb and the object it is controlling (the maximum or minimum value).</p>
<p>Sliders should be labelled and a reference to the label should be provided using <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a>.</p>
<p>Finally, if your range slider also controls a live area you should establish the controls relationship between each slider button (upper and lower) and the live area you it is controlling.</p></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><ul><li><a href="http://codetalks.org/source/widgets/slider/pretty-slider-dual-inline-img.html" title="http://codetalks.org/source/widgets/slider/pretty-slider-dual-inline-img.html" rel="nofollow">Multi-Thumb Slider Example using inline images for thumbs</a></li><li><a href="http://www.paciellogroup.com/blog/misc/samples/aria/slider/doubleslider.html" title="http://www.paciellogroup.com/blog/misc/samples/aria/slider/doubleslider.html" rel="nofollow">TPG double slider</a></li></ul>
<p> </p></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="spinbutton">
<h3 class="widget-name"><code>Spinbutton</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">Range with which a user selects from amongst discrete choices.
A spinbutton typically allows the user to select from the given range through the use of an up and down button on the keyboard. Visibly, the current value is incremented or decremented until a maximum or minimum value is reached. </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li><kbd>Right Arrow</kbd> and <kbd>Up Arrow</kbd> increase the value. </li><li><kbd>Left Arrow</kbd> and <kbd>Down Arrow</kbd> decrease the value. </li><li><kbd>Home</kbd> and <kbd>End</kbd> key move to the maximum or minimum values </li><li>Optional <kbd>Page Up</kbd> and <kbd>Page Down</kbd> incrementally increase or decrease the value </li><li><kbd>Tab</kbd> key moves into and out of the widget </li></ul>
<p class="note">Focus should remain on the edit field </p>
<p class="note">Localization for right to left languages may wish to reverse the left and right arrows. </p> </td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#spinbutton"><code>spinbutton</code></a> is a child of both
<a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#composite"><code>composite</code></a>
and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#range"><code>range</code></a>. It requires current, minimum, and maximum values be set with the WAI-ARIA properties
<a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuenow"><code>aria-valuenow</code></a>, <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuemin"><code>aria-valuemin</code></a>, and <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-valuemax"><code>aria-valuemax</code></a>. </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><p><a href="http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_Spinner.html" title="http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_Spinner.html" rel="nofollow">dojo nightly build</a></p></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="tabpanel">
<h3 class="widget-name"><code>Tab Panel</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"><p>A tabbed interface component is a container for resources associated with a tab. It is a set of layered pages where only one page is displayed at a time. The general look is similar to a file folder with a "tab" that contains the title of the folder. The tabs are arranged along one of the edges of the contents but most commonly are found at the top of the page. The user navigates and makes the contents of each page visible by interacting with the title "tab" of the page. Sometimes referred to as a tab container or tab panel. Terms for understanding Tab Panels include:</p>
<dl><dt>tabbed interface component</dt><dd> a set of tabs and associated tab panels </dd><dt>tab panel</dt><dd>contents area that is associated with a tab</dd><dt>tab</dt><dd>the label/title area of the tab panel. This is where you click to activate a tab panel </dd><dt>tablist</dt><dd>the set of tabs</dd></dl>
<p>When the user activates a tab, the contents of the corresponding tab panel is made visible. The tab is considered "active". The tab remains active until another tab is activated. The active tab is placed into the tab order. Only the active tab should be in the tab order. A default tab is specified that is active when the tabbed interface component is initialized. A collection of tabs and their associated tab panels is a complex widget, because it performs show/hide actions as well as moving the user's point of regard around within the content. </p></td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li> <kbd>Tab</kbd> - only the active tab is in the tab order. The user reaches the tabbed panel component by pressing the tab key until the active tab title receives focus. </li><li><kbd>Left Arrow</kbd> - with focus on a tab, pressing the left arrow will move focus to the previous tab in the tab list and activate that tab. Pressing the left arrow when the focus is on the first tab in the tab list will move focus and activate the last tab in the list. </li><li><kbd>Right Arrow</kbd> - with focus on a tab, pressing the right arrow will move focus to the next tab in the tab list and activate that tab. Pressing the right arrow when the focus is on the last tab in the tab list will move focus to and activate the first tab in the list. </li><li><kbd>Up arrow</kbd> - behaves the same as left arrow in order to support vertical tabs </li><li><kbd>Down arrow</kbd> - behaves the same as right arrow in order to support vertical tabs </li><li><kbd>Ctrl+Up Arrow</kbd> - with focus anywhere within the tab panel, pressing <kbd>Ctrl+Up Arrow</kbd> will move focus to the tab for that panel. This is not standard behavior - is this something we want to implement? Is it necessary if we provide a mechanism to change the active tab? Similar to <kbd>Ctrl+PageUp</kbd>/<kbd>Ctrl+PageDown</kbd> in Firefox to switch tabs? </li><li> <kbd>Alt+Del</kbd> - When deletion is allowed, with focus anywhere within the tab panel, pressing alt-del will delete the current tab and tab panel from the tabbed interface control. If additional tabs remain in the tabbed interface, focus goes to the next tab in the tab list. An alternative to providing a keystroke to close a tab is to provide a context menu that is associated with the tab title. When focus is on the tab, pressing <kbd>Shift+F10</kbd> or pressing the right mouse button will open a context menu with the close choice </li><li> <kbd>Ctrl+PageUp</kbd> - When focus is inside of a tab panel, pressing <kbd>Ctrl+PageUp</kbd> moves focus to the tab of the previous tab in the tab list and activates that tab. When focus is in the first tab panel in the tab list, pressing <kbd>Ctrl+PageUp</kbd> will move focus to the last tab in the tab list and activate that tab. </li><li><kbd>Ctrl+PageDown</kbd> When focus is inside of a tab panel, pressing <kbd>Ctrl+PageDown</kbd> moves focus to the tab of the next tab in the tab list and activates that tab. When focus is in the last tab panel in the tab list, pressing <kbd>Ctrl+PageUp</kbd>will move focus to the first tab in the tab list and activate that tab. </li></ul>
<p>Regarding <kbd>Ctrl+PageUp</kbd>/<kbd>Ctrl+PageDown</kbd>. This is currently implemented in Firefox to move between browser tabs. Firefox also supports <kbd>Ctrl+Tab</kbd> and <kbd>Ctrl+Shift+Tab</kbd> to move between tabs. Internet Explorer 7 also uses <kbd>Ctrl+Tab</kbd> and <kbd>Ctrl+Shift+Tab</kbd>. There may be advantages to using <kbd>Ctrl+PageUp</kbd>/<kbd>Ctrl+PageDown</kbd> as the keys to change tabs since it is a recognizable keystroke to at least Firefox users and is also supported by the Windows operating system to move between panels in a tabbed dialog. The problem is that if the user is within a tabbed interface control on a Web page, they can not easily switch browser tabs without first moving focus outside of the tabbed interface control. This may be acceptable. The other issue is if the entire Web page is a tabbed interface control - in that case the user could not ever switch browser tabs unless the control on the Web page ignored the <kbd>Ctrl+PageUp</kbd>/<kbd>Ctrl+PageDown</kbd> keypress (and thus letting the browser access it) when the first or last tab was reached. </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><ul><li> The tabbed interface component uses the role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tabpanel"><code>tabpanel</code></a>. </li><li> The tabbed panel contains tabs and their panels. An element with role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tab"><code>tab</code></a> is used as a grouping label, providing a link for selecting the tabcontent to be rendered to the user. </li><li>The tabbed panel should manage the selected state of each tab by maintaining its <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-selected"><code>aria-selected</code></a> state. </li><li> A <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tablist"><code>tablist</code></a> is the container role for a set of elements with the role attribute set to <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tab"><code>tab</code></a>. </li></ul></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><ul><li><a href="http://codetalks.org/source/widgets/tabpanel/tabpanel1.html">Simple tab panel</a> </li><li><a href="http://codetalks.org/source/widgets/tabpanel/tabpanel.html">Another tab panel</a></li></ul> </td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="toolbar">
<h3 class="widget-name"><code>Tool Bar</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"><p>A <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#toolbar"><code>toolbar</code></a> is a flat non-hierarchical collection of controls that provides quick access to a subset of the functions found in the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menubar"><code>menubar</code></a>/<a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menu"><code>menu</code></a> hierarchy. Its purpose is to reduce effort in using these functions. There should neither be too few nor too many controls within a toolbar. When creating toolbars try to limit the number of items to approximately seven, as forcing users to navigate through an excessive number of items is a usability concern. Since navigation between toolbars is accomplished using a <kbd>Tab</kbd> keystroke, too few controls within a toolbar also creates a usability issue as it requires numerous <kbd>Tab</kbd> keystrokes to navigate between toolbars.</p><p>Authors must supply an <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-label"><code>aria-label</code></a> property on each toolbar when their application contains more than one toolbar. The label provides information about the purpose of each toolbar; for example, an "Edit" toolbar that contains cut, copy, paste, clear, undo, and redo controls. If the application has many toolbars, it is recommended that they be placed inside a container element with a role of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#group"><code>group</code></a> to allow for keyboard navigation to the entire collection of toolbars. It is further recommended that authors provide access to these functions via a <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menubar"><code>menubar</code></a> and <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#menu"><code>menu</code></a>s to avoid cluttering the user interface with a surplus of toolbars.</p></td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li><kbd>Tab</kbd> moves focus to the first enabled toolbar button. </li><li>A subsequent <kbd>Tab</kbd> moves focus out of the toolbar </li><li><kbd>Left Arrow</kbd> and <kbd>Right Arrow</kbd> keys navigate to the enabled buttons in the toolbar </li></ul>
<p class="note">Direction may need to be adjusted for Right to Left languages </p>
<p class="note">There is debate concerning the treatment of disabled toolbar buttons -- should they be focusable or not? Visually, disbled buttons are grayed-out, and typicially not placed in the <kbd>tab</kbd> order. This invites an issue about how a screen reader user discovers these buttons if they are not keyboard navigable. Several ways of handling this include:</p>
<ul><li>In software applications like Microsoft® Word, the toolbars themselves are not reachable by the keyboard user, but the features are available on one of the drop-down menus. </li><li>Users set a preference indicating whether they want disabled buttons focusable.</li><li>Disabled buttons are not focusable until they are enabled. This is the way tool bars currently work.</li><li>Disabled buttons are focusable, but read by the screen reader as disabled.</li></ul></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1">The <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#toolbar"><code>toolbar</code></a> is a child of <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#group"><code>group</code></a>. </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><a href="http://wiki.codetalks.org/wiki/index.php/Set_of_ARIA_Test_Cases#Toolbar">Toolbar with WAI-ARIA live region</a></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="tooltip">
<h3 class="widget-name"><code>Tooltip Widget</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">Popup that displays a description for an element when a user passes over or rests on that element. Supplement to the normal tooltip processing of the user agent. It should popup automatically when the user gives input focus to the widget or element with which it is associated. The tooltip widget can be dismissed by pressing the ESC key or by other methods noted below. The tooltip widget differs from the <a href="#dialog_tooltip">Dialog (Tooltip)</a> in that it does not receive focus at any time. </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p><kbd>Esc</kbd>: Dismisses the Tooltip. </p>
<p class="note">Note: The trigger element to which the tooltip is attached, e.g., a link, should never actually lose input focus. </p>
<p class="note">Note: If the tooltip is invoked when the trigger element gets focus, then it should be dismissed when it no longer has focus (onBlur). If the tooltip is invoked with mouseIn, then it should be dismissed with a mouseOut. </p>
<p class="note">Note: If more then one widget uses the same keys, e.g., Esc, then they should be handled in a Last In First Out (LIFO) manner. For example, an editable grid contains gridcells which contain date fields. The user invokes Actionable mode on the grid and then interacts with the Date Field to invoke the Date Picker. At this point the first press of the Escape key will close the Date Picker, the second press will exit Actionable mode and return to Navigation mode.</p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1">Uses the WAI-ARIA role <span class="widget-description"><a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tooltip"><code>tooltip</code></a></span></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><a href="http://codetalks.org/source/widgets/tooltip/tooltip.html">Simple tooltip</a></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="treegrid">
<h3 class="widget-name"><code>Tree Grid</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">A grid whose rows can be expanded and collapsed in the same manner as for a tree. A Tree Grid is a combination of a Treeview and a Table with rows that are expandable</td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p>There are two modes of keyboard interaction: </p>
<ul><li>Navigation Mode (Read-Only) is the default mode, and allows quick and intuitive navigation around the grid.
<ul><li><kbd>Tab</kbd>
<ul><li>The initial tab enters the grid with focus on the first cell of the first row, often a header. </li><li>Once in the grid a second tab moves out of the grid to the next tab stop. </li><li>Once focus is established in the grid, a <kbd>Tab</kbd> into or a <kbd>Shift+Tab</kbd> into the grid will return to the cell which last had focus. </li></ul>
</li><li><kbd>Left Arrow</kbd> and <kbd>Right Arrow</kbd> keys navigate between columns. If the next cell in the row is empty, focus should not move. </li><li><kbd>Up Arrow</kbd> and <kbd>Down Arrow</kbd> The down arrow moves focus to the first column of a child row, if expanded. Otherwise focus is moved to the same column in the next row. Up arrow performs the same navigation but in reverse. </li><li><kbd>Ctrl+Left</kbd> and <kbd>Ctrl+Right Arrows</kbd> expand or collapse rows. </li><li>If the cell contains an editable field, the <kbd>Enter</kbd> key starts edit mode and the <kbd>Esc</kbd> key exits edit mode. </li><li>Selecting Cells
<ul><li><kbd>Ctrl+Space</kbd> selects the current column. </li><li><kbd>Shift+Space</kbd> selects the current row. </li><li><kbd>Ctrl+A</kbd> selects the entire grid. </li><li><kbd>Shift+Arrow</kbd> selects contiguous cells. </li><li><kbd>Shift+F8</kbd> Allows additional cells to be added to a previous selection to accomplish non-contiguous selection. </li></ul>
</li></ul>
</li></ul>
<p class="note">Note: The author may choose to indent child nodes visually. This should be done with an appropriate number of spacer cells marked as presentation in order to keep the headers aligned. </p>
<p class="note">Note: If cells are used for padding or layout of the hierarchy, navigation to those presentational cells should be prevented. </p>
<ul><li>Actionable Mode (Interactive) allows the interaction with other objects that might be found in the grid cells such as edit fields, links, etc.
<ul><li><kbd>F2</kbd> pressed anywhere inside the grid will enter Actionable Mode. Focus will not be moved. </li><li><kbd>Enter</kbd> pressed while focus is on an actionable item will enter Actionable Mode. Focus will remain on the actionable item that has focus. </li><li>Optionally, alphanumeric keys pressed while focus is on an actionable item will enter Actionable Mode. Focus will remain on the actionable item that has focus. </li><li>Using grid as an example, by default, pressing <kbd>Esc</kbd> anywhere inside the grid will mean exiting Actionable mode (by which the user may enter text or perform an action to complete a operation) and a return to Navigation Mode (where the user is allowed to move focus among elements). If a widget is in the current grid cell that also uses the <kbd>Esc</kbd> key, then it should cancel the event propagation. A subsequent press of the <kbd>Esc</kbd> key will return focus to the parent widget.</li><li><kbd>Tab</kbd> will move to the next actionable (tabbable) item in the grid and stay within the grid wrapping at the bottom. In this mode each tabbable object in each cell of the grid can be reached with the tab key. If multiple tabbable items are located inside a single grid cell, the tab will stop at each one. When the last tabbable item in a cell is reached the next tab will move to the next tabbable item in the grid, wrapping at the last tabbable item in the grid. </li><li><kbd>Shift+Tab</kbd> moves to the previous actionable (tabbable) item in the grid and stays within the grid, wrapping at the top. </li></ul>
</li></ul>
</td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><p>Uses the WAI-ARIA role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#treegrid"><code>treegrid</code></a>, and requires the child element <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#row"><code>row</code></a>. By default a treegrid is considered to be editable, meaning all gridcells are editable. </p>
<ul><li>To make a treegrid read-only, set <code>aria-readonly="true"</code> on the document element having a <code>role="treegrid."</code> This will make all gridcells read-only. </li><li>To override the read-only status on an individual gridcell, set its <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-readonly"><code>aria-readonly</code></a> property to false. </li></ul> </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><ul><li><a href="http://codetalks.org/source/widgets/treegrid/treegrid.sample.html" title="http://codetalks.org/source/widgets/treegrid/treegrid.sample.html" rel="nofollow">Grid with expandable cells</a></li><li><a href="http://codetalks.org/source/widgets/treegrid/treegrid.html" title="http://codetalks.org/source/widgets/treegrid/treegrid.html" rel="nofollow">Grid with one expandable cell</a></li><li>For a visual (not accessible) example of where padding cells have been implemented see: <a href="http://download.dojotoolkit.org/release-1.4.1/dojo-release-1.4.1/dojox/grid/tests/test_treegrid.html" rel="nofollow">dojo's TreeGrid example</a>. </li><li>An example where padding cells have not been used (also not accessible): <a href="http://jdevadf.oracle.com/adf-richclient-demo/faces/components/treeTable.jspx" rel="nofollow">Oracle's Tree Grid</a>. </li></ul></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="TreeView">
<h3 class="widget-name"><code>Tree View</code> <span class="type-indicator">(widget)</span></h3>
<table class="widget-features" cellspacing="0"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1"><p>A
tree view is a component to navigate hierarchical lists. It is made up
of one or more top level nodes. A node may have children or it may be
an end node. Nodes with children can be expanded or collapsed - when
expanded its child nodes are visible. When collapsed the children are
not visible. There is generally some sort of visual indication whether
a node has children and can be expanded. Any number of nodes can be
expanded at a time and child nodes may contain children. </p>
<p>A
tree node is commonly used to navigate the directories and files on a
file system. The directory nodes can be expanded and collapsed to
reveal its contained subdirectories and files. Terms for understanding
tree views include:</p>
<dl><dt>node</dt><dd>An item in a tree. </dd><dt>parent node</dt><dd>Node with children. It can be opened / expanded or closed / collapsed </dd><dt>open node</dt><dd>Expanded node with children; first-level children are visible. </dd><dt>closed node</dt><dd>Closed node with children; the children are not visible. </dd><dt>end node</dt><dd>Node with no children </dd></dl>
<p>General behavior for tree views follows:</p>
<ul><li>On first load of the tree component, the top level node is in the tab order. </li><li>One and only one node of the tree component is in the tab order of the page at any time. </li><li>The last visited node in the tree control is retained in the tab order when the user navigates away from the tree control. </li><li>Nodes can be focused and/or selected. There must be visual distinction between focused and selected nodes. </li><li>Arrowing
to an item with the keyboard or clicking on an item with the mouse will
focus and select the node. Any previous selections are cleared </li></ul></td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><ul><li> <kbd>Up Arrow</kbd> and <kbd>Down arrow</kbd> keys move between visible nodes. </li><li> <kbd>Left arrow</kbd> key on an expanded node closes the node. </li><li> <kbd>Left arrow</kbd> key on a closed or end node moves focus to the node's parent. </li><li> <kbd>Right arrow</kbd> key expands a closed node, moves to the first child of an open node, or does nothing on an end node. </li><li> <kbd>Enter</kbd> key performs the default action on end nodes. </li><li> Typing a letter key moves focus to the next instance of a visible node whose title begins with that letter. </li><li> <kbd>Home</kbd> key moves to the top node in the tree view. </li><li> <kbd>End</kbd> key moves to the last visible node in the tree view. </li><li> <kbd>Ctrl+Arrow</kbd> to an item with the keyboard focuses the item (but does not select it). Previous selections are maintained, provided that the <kbd>Ctrl</kbd> key is not released or that some other keyboard function is not performed. </li><li> <kbd>Ctrl+Space</kbd> with focus on an item toggles the selection of the item. </li><li> <kbd>Shift+Up Arrow</kbd> extends selection up one node. </li><li> <kbd>Shift+Down Arrow</kbd> extends selection down one node. </li><li> <kbd>Shift+Home</kbd> extends selection up to the top-most node. </li><li> <kbd>Shift+PageDown</kbd> extends selection down to the last node. </li><li> <kbd>*</kbd>(asterisk) on keypad expands all nodes. </li></ul></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1">A tree view uses the WAI-ARIA role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#tree"><code>tree</code></a>,
where tree is a main container element. A tree can itself contain
subtrees that may be collapsed and expanded; these have the role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#treeitem"><code>treeitem</code></a>. A collection of treeitems to be expanded and collapsed are enclosed in a group. See the XHTML example in the <cite><a href="http://www.w3.org/TR/wai-aria/">WAI-ARIA</a></cite> [<cite><a href="#ref_ARIA">ARIA</a></cite>] specification.</td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><ul><li> <a href="http://codetalks.org/source/widgets/tree/tree.html" title="http://codetalks.org/source/widgets/tree/tree.html" rel="nofollow">Simple tree</a></li><li> <a href="http://codetalks.org/source/widgets/tree/tree3.html" title="http://codetalks.org/source/widgets/tree/tree3.html" rel="nofollow">Tree</a></li></ul></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="windowsplitter">
<h3 class="widget-name"><code>Window Splitter</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">Visible separator between sections of a Window which can be used to modify the size of the panes</td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p>A Window Splitter can take one of two forms, namely, fixed size and variable size.
</p>
<ul><li><kbd>Tab</kbd> - Like other widgets, the tab key is used to move focus to the splitter. It should appear in the normal tab order of the page. A second tab will move focus to the next tabbable item on the page. </li><li><kbd>Left Arrow</kbd> and <kbd>Right Arrow</kbd> - In the case of a vertical splitter these keys will move the splitter to the left and to the right.</li><li><kbd>Up Arrow</kbd> and <kbd>Down Arrow</kbd> - In the case of a horizontal splitter these keys will move the splitter up and down.</li><li><kbd>End</kbd> - Moves splitter to the maximum size of the region. </li><li><kbd>Home</kbd> - Moves splitter to the minimum size of the region. </li><li><kbd>Enter</kbd> Restore splitter to previous position (undo Home or End). </li><li><kbd>F6</kbd> Optionally is recommended to rotate through the window panes. </li><li><kbd>Ctrl+F6</kbd> Optionally brings focus directly to the splitter. Pressing <kbd>Control+F6</kbd> again would rotate forward through additional splitters located on the page. </li><li><kbd>Shift+Ctrl+F6</kbd> optionally reverses the direction rotating backwards through additional splitters located on the page. </li></ul>
<p class="note">Note: Fixed size splitter simply omits implementation of the arrow keys. </p>
<p class="note">Note: The group recommends unique naming of the window splitter to avoid the confusion that could be created by multiple splitters located on the same window. </p>
<p class="note">Note: The group recommends that a splitter "default position restore" option be available in a context menu. </p>
<p> </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"><p>Uses the WAI-ARIA role <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#separator"><code>separator</code></a>. and requires the child element <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#row"><code>row</code></a>. By default a treegrid is considered to be editable, meaning all gridcells are editable.</p>
<ul><li>Most window splitters are expandable and collapsible. When it is, ensure that the <a class="state-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-expanded"><code>aria-expanded</code></a> state is maintained.</li><li>As there may be multiple splitters make sure that you
set <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-label"><code>aria-label</code></a>, the <code>title</code> attribute, or provide an <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-labelledby"><code>aria-labelledby</code></a> relationship to label text on the splitter to ensure that an accessible name may be computed by the user agent. This will allow the assistive technology to convey to the user which window splitter is being operated.</li><li>Author should apply <a class="property-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/states_and_properties#aria-controls"><code>aria-controls</code></a> to the element having the <a class="role-reference" href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/roles#separator"><code>separator</code></a> role. It's values should be the IDs of the panels it controls. This way an assistive technology may navigate to the pane it controls. If no panel exists (it disappears from the DOM) no ID reference is needed for that panel.</li></ul></td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"><a href="http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/layout/test_BorderContainer.html">Window splitter</a></td></tr></tbody></table>
</div>
<hr/>
<div class="widget" id="wizard">
<h3 class="widget-name"><code>Wizard</code> <span class="type-indicator">(widget)</span></h3>
<table cellspacing="0" class="widget-features"><caption>
Characteristics:
</caption><tbody><tr><td class="widget-description-head" scope="row" rowspan="1" colspan="1">Description: </td><td class="widget-description" rowspan="1" colspan="1">A sequence of dialogs or panels guiding the user through performing a task. </td></tr><tr><td class="widget-keyboard-head" scope="row" rowspan="1" colspan="1">Keyboard Interaction: </td><td class="widget-keyboard" rowspan="1" colspan="1"><p>A Wizard can be done in several ways. Either is valid. </p>
<ul><li>Method 1: Like a <a href="#toolbar">Tool Bar</a> </li><li>Method 2: Controls as Default Actions
<ul><li><kbd>Esc</kbd> cancels the wizard. </li><li><kbd>Enter</kbd> invokes the "next" action; If the last page, it invokes "finish" </li></ul>
</li><li>Method 3: Hot Keys
<ul><li><kbd>Ctrl+Alt+N</kbd> next, finish </li><li><kbd>Ctrl+Alt+P</kbd> previous </li><li><kbd>Esc</kbd> cancel, exit without saving </li><li><kbd>Ctrl+Alt+R</kbd> reset current page to default settings </li><li><kbd>Ctrl+Alt+S</kbd> save and exit </li></ul>
</li><li>Method 4: Like a <a href="#dialog_nonmodal">Dialog</a> </li></ul> <p> </p></td></tr><tr><td class="widget-aria-head" scope="row" rowspan="1" colspan="1">WAI-ARIA Roles, States, and Properties: </td><td class="widget-aria" rowspan="1" colspan="1"> </td></tr><tr><td class="widget-example-head" scope="row" rowspan="1" colspan="1">Example: </td><td class="widget-example" rowspan="1" colspan="1"> </td></tr></tbody></table>
</div>
</div>
<div class="section" id="reuse_comp_lib">
<h2><span class="tocnum">11. </span> Reusable Component Libraries </h2>
<p>Rich internet applications are complex to author. To save time, it is often faster to use existing widget libraries that implement WAI-ARIA and that have already gone through:</p>
<ul><li> extensive assistive technology testing</li><li>cross browser testing</li><li>testing to ensure that the widgets respond to desktop settings</li><li>testing to ensure that the widgets match a common keyboard style guide</li></ul>
<p>Some publicly available UI component libraries have already implemented WAI-ARIA. Authors can reuse such libraries to start developing accessible rich internet applications.</p>
</div>
<div class="section" id="appendices">
<h2><span class="tocnum">12. </span> Appendices</h2>
<div class="section" id="references">
<h3><span class="tocnum">12.1. </span> References</h3>
<p>This section is <em>informative</em>.</p>
<p>Resources referenced informatively provide useful information relevant to this document, but do not comprise a part of its requirements.</p>
<dl><dt><a id="ref_ARIA" name="ref_ARIA"></a>[ARIA]</dt><dd><cite><a href="http://www.w3.org/TR/2010/WD-wai-aria-20100916/">Accessible
Rich Internet Applications (<acronym title="Accessible Rich Internet Applications">WAI-ARIA</acronym>) 1.0</a></cite>. J. Craig,
M. Cooper, L. Pappas, R. Schwerdtfeger, L. Seeman, Editors,
W3C Working Draft (work in progress), 16 September 2010. This version
of <acronym title="Accessible Rich Internet Applications">WAI-ARIA</acronym> is
available at http://www.w3.org/TR/2010/WD-wai-aria-20100916/. <a href="http://www.w3.org/TR/wai-aria/">Latest
version of <acronym title="Accessible Rich Internet Applications">WAI-ARIA</acronym></a> available
at http://www.w3.org/TR/wai-aria/.</dd>
<dt><a id="ref_ARIA-PRIMER" name="ref_ARIA-PRIMER"></a>[ARIA-PRIMER]</dt><dd><cite><a href="http://www.w3.org/TR/2010/WD-wai-aria-primer-20100916/"><acronym title="Accessible Rich Internet Applications">WAI-ARIA</acronym> 1.0
Primer</a></cite>. L. Pappas, R. Schwerdtfeger, M. Cooper, Editors,
W3C Working Draft (work in progress), 16 September 2010. This version
of <acronym title="Accessible Rich Internet Applications">WAI-ARIA</acronym> Primer is available at http://www.w3.org/TR/2010/WD-wai-aria-primer-20100916/. <a href="http://www.w3.org/TR/wai-aria-primer/">Latest
version of <acronym title="Accessible Rich Internet Applications">WAI-ARIA</acronym> Primer</a> available at http://www.w3.org/TR/wai-aria-primer/. </dd><dt><a id="ref_ARIA-ROADMAP" name="ref_ARIA-ROADMAP"></a>[ARIA-ROADMAP]</dt><dd><cite><a href="http://www.w3.org/TR/2008/WD-wai-aria-roadmap-20080204/">Roadmap for Accessible Rich Internet Applications (<acronym title="Accessible Rich Internet Applications">WAI-ARIA</acronym> Roadmap)</a></cite>, R. Schwerdtfeger, Editor, W3C Working Draft (work in progress), 4 February 2008. This version of <acronym title="Accessible Rich Internet Applications">WAI-ARIA</acronym> Roadmap is available at http://www.w3.org/TR/2008/WD-wai-aria-roadmap-20080204/. <a href="http://www.w3.org/TR/wai-aria-roadmap/">Latest version of <acronym title="Accessible Rich Internet Applications">WAI-ARIA</acronym> Roadmap</a> available at http://www.w3.org/TR/wai-aria-roadmap/.</dd><dt><a class="normref" id="ref_DOM" name="ref_DOM"></a>[DOM]</dt><dd><cite><a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/">Document Object Model (DOM) Level 2 Core Specification</a></cite>, L. Wood, G. Nicol, A. Le Hors, J. Robie, S. Byrne, P. Le Hégaret, M. Champion, Editors, W3C Recommendation, 13 November 2000, http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/. <a href="http://www.w3.org/TR/DOM-Level-2-Core/" title="Latest version of Document Object Model (DOM) Level 2 Core Specification">Latest version of DOM Core</a> available at http://www.w3.org/TR/DOM-Level-2-Core/.</dd></dl>
</div>
<div class="section" id="acknowledgements">
<h3><span class="tocnum">12.2. </span> Acknowledgments</h3>
<p>The following people contributed to the development of this document.</p>
<div class="section" id="ack_group">
<h4><span class="tocnum">12.2.1. </span> Participants in the PFWG at the time of publication</h4>
<ol><li>David Bolter (Invited Expert, University of Toronto Adaptive Technology Resource Centre) </li><li>Sally Cain (Royal National Institute of Blind People)</li><li>Ben Caldwell (Invited Expert, Trace)</li><li>Charles Chen (Google, Inc.) </li><li>Michael Cooper (W3C/MIT)</li><li>James Craig (Apple, Inc.) </li><li>Dimitar Denev (Frauenhofer Gesellschaft)</li><li>Steve Faulkner (Invited Expert, The Paciello Group) </li><li>Kentarou Fukuda (IBM Corporation)</li><li>Andres Gonzalez (Adobe Systems Inc.)</li><li>Georgios Grigoriadis (SAP AG) </li><li>Jon Gunderson (Invited Expert, UIUC)</li><li>Markus Gylling (DAISY Consortium)</li><li>Sean Hayes (Microsoft Corporation)</li><li>John Hrvatin (Microsoft Corporation) </li><li>Kenny Johar (Vision Australia) </li><li>Masahiko Kaneko (Microsoft Corporation) </li><li>Matthew King (IBM Corporation)</li><li>Diego La Monica (International Webmasters Association / HTML Writers Guild (IWA-HWG)) </li><li>Gez Lemon (International Webmasters Association / HTML Writers Guild (IWA-HWG))</li><li>Thomas Logan (HiSoftware Inc.)</li><li>William Loughborough (Invited Expert)</li><li>Anders Markussen (Opera Software) </li><li>Matthew May (Adobe Systems Inc.) </li><li>Shane McCarron (Invited Expert, Aptest)</li><li>Charles McCathieNevile (Opera Software)</li><li>James Nurthen (Oracle Corporation) </li><li>Joshue O'Connor (Invited Expert) </li><li>Artur Ortega (Yahoo!, Inc.)</li><li>Simon Pieters (Opera Software) </li><li>T.V. Raman (Google, Inc.) </li><li>Gregory Rosmaita (Invited Expert)</li><li>Tony Ross (Microsoft Corporation)</li><li>Janina Sajka (Invited Expert, The Linux Foundation)</li><li>Martin Schaus (SAP AG) </li><li>Joseph Scheuhammer (Invited Expert, Inclusive Design Research Centre, OCAD University) </li><li>Stefan Schnabel (SAP AG) </li><li>Richard Schwerdtfeger (IBM Corporation)</li><li>Lisa Seeman (Invited Expert, Aqueous) </li><li>Cynthia Shelly (Microsoft Corporation) </li><li>Andi Snow-Weaver (IBM Corporation)</li><li>Henny Swan (Opera Software)</li><li>Gregg Vanderheiden (Invited Expert, Trace)</li><li>Léonie Watson (Invited Expert, Nomensa)</li><li>Gottfried Zimmermann (Invited Expert, Access Technologies Group)</li></ol>
</div>
<div class="section" id="ack_others">
<h4><span class="tocnum">12.2.2. </span> Other previously active PFWG participants and other contributors to the Accessible Rich Internet Applications specification</h4>
<p>Special thanks to Aaron Leventhal for effort and insight as he implemented a working prototype of accessibility <abbr title="Application Programming Interface">API</abbr> bindings. Special thanks to Al Gilman for his work while chair of the PFWG in bringing the ARIA technology to fruition.</p>
<p> Jim Allan (TSB), Simon Bates, Chris Blouch (AOL), Judy Brewer (W3C/MIT),
Christian Cohrs, Donald Evans (AOL), Geoff Freed (WGBH/NCAM), Becky
Gibson (IBM), Alfred S. Gilman, Andres Gonzalez (Adobe), Jeff Grimes
(Oracle), Barbara Hartel, Earl Johnson (Sun), Jael Kurz, Aaron Leventhal
(IBM Corporation), Alex Li (SAP), Linda Mao (Microsoft), Shane McCarron
(ApTest), Lisa Pappas (Society for Technical Communication (STC)),
Dave Pawson (RNIB), David Poehlman, Marc Silbey (Microsoft Corporation),
Henri Sivonen (Mozilla), Vitaly Sourikov, Mike Squillace (IBM), Ryan Williams
(Oracle), Tom Wlodkowski.</p>
</div>
<div class="section" id="ack_funders">
<h4><span class="tocnum">12.2.3. </span> Enabling funders</h4>
<p>This publication has been funded in part with Federal funds from the U.S. Department of Education, National Institute on Disability and Rehabilitation Research (NIDRR) under contract number ED05CO0039. The content of this publication does not necessarily reflect the views or policies of the U.S. Department of Education, nor does mention of trade names, commercial products, or organizations imply endorsement by the U.S. Government.</p>
</div>
</div>
</div>
</body></html>