可访问性标准
几乎所有可访问性标准和法律都源自 W3C Web Content Accessibility 1.0 Guidelines (WCAG)。这些准则是由 World Wide Web Consortium 在 1999 年 5 月 5 日作为推荐标准首次发布的(请参阅 http://www.w3.org/TR/WCAG10)。
WCAG 包含 14 条准则。每一条准则又包含一个或多个进一步阐明该准则的检查点。每个检查点都按 1 到 3 的优先级进行分级。为使这些准则的实施变得更加容易,W3C 已经发布了一组文档,其中包含有关如何遵守这些准则的技术(请参阅 http://www.w3.org/TR/WCAG10-TECHS/)。
您可以要求不同程度地遵守 WCAG 准则。如果要求 Web 站点满足所有优先级 1 的检查点,则您可以显示具有 Conformance Level A 的标识语。当 Web 站点满足所有优先级 1 和 2 检查点时,该 Web 站点可以显示 Conformance Level Double-A 标识语。最后,满足所有检查点的 Web 站点可以显示 Conformance Level Triple-A 标识语(请参阅 http://www.w3.org/WAI/WCAG1-Conformance.html)。
508 节准则源自 WCAG 准则。在美国,联邦政府机构(以及与联邦政府机构订立合同的公司)需要对这组准则给予最高程度的关注,因为这些准则具有法律效力。您可以在 508 节 Web 站点读到 508 节准则的完整文本。
ASP.NET 2.0 框架旨在使您能够满足所有 WCAG 优先级 1 和优先级 2 的检查点以及所有 508 节准则。这些准则使用起来非常严格。每个使用 ASP.NET 2.0 框架的开发人员都需要检查和测试每个 ASP.NET 控件的可访问性。而且,每个开发人员都应该在桌面上安装一个屏幕阅读器,以便针对这些准则测试页。
ASP.NET 2.0 中的可访问性改进
本文重点讨论 ASP.NET 2.0 框架中六个方面的可访问性改进。在下列各节中,您将学习如何使用 ASP.NET 控件来显示可访问的图像、表单、导航、数据和 XHTML。在本节结尾,我们还将考虑与在 ASP.NET 页中使用客户端脚本有关的可访问性问题。
创建可访问的图像
您不应当做这样的假设:与 Web 站点交互的每个人都可以实际看到您的 Web 站点。如果某个人是盲人或者视力不足,那么这个人就可能需要使用屏幕阅读器或盲文显示器来访问您的 Web 页。屏幕阅读器通过使用语音合成器来朗读 Web 页中的文本。盲文显示器将页中的文本转换为盲文表示。
对于无法看到它们的人而言,图像和其他非文本页元素(例如,Java、Shockwave 和 Flash 内容)都是没有用的。如果您希望使 Web 站点对于盲人或弱视的人是可访问的,那么需要为 Web 页中的所有非文本内容提供文本等效内容。
Web 页中的每个图像都应该包含 alt 属性。alt 属性用来表示由屏幕阅读器或其他辅助性设备阅读的替换文本。以下是 alt 属性的使用方式。
alt 属性应当包含图像的说明。在任何情况下,它都不应该只是包含该图像的文件名。alt 属性的目的是为盲人和视力正常的人传递相同的图像信息。写入 alt 属性的值时要求对该元素的含义进行人工解释。因此,不能自动完成创建 alt 属性的过程。
每个显示图像的 ASP.NET 控件都包含用于为该图像提供替换文本的方法。例如,ASP.NET 图像控件包含 AlternateText 属性。如果使用 Image 控件,则需要将 AlternateText 属性设置为有意义的值。
如果某个图像只是用作设计元素,则应当将它的 alt 属性设置为空字符串。如果图像不具有需要传达的有用信息,那么就没有理由使屏幕阅读器的页解说变得散乱。
在 ASP.NET 2.0 框架中,必须采取特殊措施,使您能够呈现空的 AlternateText。如果将空文本分配给 ASP.NET 控件的属性,则 ASP.NET 控件将根本不会呈现该属性。例如,假设将以下 ASP.NET Image 控件添加到页中。
在这种情况下,会呈现以下标记。
请注意,alt 属性消失了。这是所有 ASP.NET 控件属性的默认行为。当没有为属性分配值时,该属性不会呈现出来。遗憾的是,在这种情况下,我们确实希望为 alt 属性呈现空值。
为了解决该问题,ASP.NET 2.0 框架中引入了以下新属性,使您能够用 Image 控件显示空替换文本:GenerateEmptyAlternateText 属性。
如果使用 GenerateEmptyAlternateText 属性,则会正确地呈现 alt="" 属性。
当图像表示某个真正复杂的事物(例如,组织结构图)时,不能使用 alt 属性来提供替换文本说明。当需要提供较长的图像含义说明时,需要使用 longdesc 属性。
longdesc 属性接受相对或绝对 URL 作为它的值。该 URL 应当链接到包含图像内容的文本说明的页。以下示例说明如何将该属性与
标记配合使用。
ASP.NET Image 控件包含一个名为 DescriptionUrl 的属性,它对应于 HTML longdesc 属性。以下示例说明如何使用该属性。
创建可访问的表单
Web 页表单可能给视力低下的人士以及缺乏动作协调性的人士带来问题。如果通过屏幕阅读器访问 Web 页表单,那么可能很难将表单域与其相应的标签相关联。例如,假设 Web 页包含以下表单。
该表单显示一个人的名和姓的输入域。在这种情况下,因为该表单显示在表中,所以屏幕阅读器用户可能很难将正确的标签与正确的表单域相关联。HTML 4.0 中引入以下新标记,以使您能够将表单域标签与表单域相关联: 标记。下面说明如何使用 标记编写前面的表单。
标记将表单域标签与其相应的表单域显式关联起来。请注意, 域包含 id 属性,这是因为 for 属性的值必须是输入域的 id 属性而不是 name 属性。
通常,ASP.NET Label 控件生成 标记。但是,如果您在声明 ASP.NET Label 控件时提供了 AssociatedControlId 属性,则该控件会呈现 标记。下面说明如何用 ASP.NET Label 和 TextBox 控件生成可访问的表单。
在为 ASP.NET 控件提供标签时,应当使用 ASP.NET Label 控件,而不是 HTML 标记。在将一个 ID 分配给 ASP.NET 控件(如 TextBox 控件)时,呈现到浏览器中的 ID 可能与您分配给该控件的 ID 不同。因此,如果使用 标记,则 标记中的 ID 可能与所呈现的 TextBox 控件的 ID 不匹配。另一方面,如果使用 ASP.NET Label 控件,则不必担心该问题。
ASP.NET CheckBox、RadioButton、CheckBoxList 和 RadioButtonList 控件自动呈现 标记。在使用这些控件时,请小心使用 Text 属性来标记控件的文本。您不应该执行以下操作。
Include Gift Wrap
相反,请执行以下操作。
对于通过屏幕阅读器与 Web 页进行交互的用户,大型表单也可能产生问题。在聆听大型表单的内容时,很容易忘记正在聆听该表单的哪个部分。在显示大型表单时,将该表单划分为多个小块是一个好主意。您可以通过使用 标记将单个表单划分为多个部分。以下示例说明如何使用该标记。
该表单通过 标记划分为两个子表单。 标记用来标记这些子表单的用途。在 Internet Explorer、Firefox 和 Opera 中显示时,这些子表单被边框直观地划分为多个单独的区域(参见图 5)。但是,重要的是要记住, 标记的主要用途是实现可访问性。如果不喜欢 标记的可视化外观,那么可通过样式表规则修改该标记的外观,或通过使用 CSS display 或 visibility 属性将该标记完全隐藏。
图 5.
标记
视力低下的人士并不是 Web 页用户中唯一可能觉得 Web 表单难以访问的人。那些缺乏动作协调性的用户也会在与表单交互时遇到困难。
在生成 Web 表单时,为每个表单域包含 accesskey 和 tabindex 属性总是一个好主意。accesskey 属性使无法使用鼠标的用户能够直接导航到任何表单域。tabindex 属性使您能够控制表单域的 Tab 键顺序。对于那些必须通过键盘(或像键盘一样操作的辅助性设备)与页面进行交互的用户而言,这两个属性可使其生活变得更方便一些。
下面是一个同时使用 accesskey 和 tabindex 属性的示例表单。
First Name
Last Name
tabindex 属性用来控制表单域的 Tab 键顺序。因为第一个表单域具有的 tabindex 值为 1,所以当用户第一次按 Tab 键时,该页中任何出现在该表单之前的其他元素都被跳过。
在使用 Internet Explorer 或 Firefox 时,按 ALT+F 可自动将焦点移至 First Name 文本框。如果按 ALT+L,则焦点会自动移至 Last Name 文本框。在使用 Opera 时,必须首先按 SHIFT+ESC,然后才能选择访问键。
请注意,First Name 和 Last Name 标签的第一个字母都带有下划线。通过为字母添加下划线,可以为 Web 站点的用户提供访问键的直观表示。这是在 Microsoft Windows 应用程序中标记访问键的标准方式。但是,还有其他在表单中指示访问键的推荐方法(请参阅 http://www.cs.tut.fi/~jkorpela/forms/accesskey.html)。
使用下划线指示访问键的一个问题是无法为按钮中的字符添加下划线,并且超链接已经带有下划线。例如,下面的 Button 控件并不像您预期和希望的那样工作。
在呈现该 ASP.NET Button 控件时,会显示实际文本 Submit,而不是显示带下划线的S字符。ASP.NET Button 控件呈现 HTML 标记,但遗憾的是, 标记不支持下划线。
您可能认为可以通过使用样式规则解决该问题。遗憾的是,当前不存在以下这种跨浏览器兼容方法:即,使用层叠样式表为 标记中的单个字符加下划线。
如果您愿意在页中使用客户端 javascript,则可以解决该问题。清单 4 中的页包含的 javascript 根据是否按下 ALT 键而显示或隐藏所有访问键。当按下 ALT 键时,会弹出一个框,显示访问键键盘组合键(参见图 6)。该脚本在 Internet Explorer 和 Firefox 中都能够正常工作(Opera 不使用 ALT 键来选择访问键)。
图 6. AccessKeys.aspx
清单 4. AccessKeys.aspx
<%@ Page Language="VB" %>
Contact Form
清单 4 中的页包含样式表和客户端 javascript。样式表隐藏了由 accessKey 类标识的任何 标记的内容。javascript 会在 ALT 键已经被按下时进行检测,并且显示 标记的内容。
请注意,即使 Web 浏览器中禁用了样式表和 javascript,该页也能够正常工作。在这种情况下,将总是显示访问键帮助(参见图 7)。
图 7. AccessKeys.aspx 适度降格
创建可访问的导航
我讨厌拨打客户支持电话并按照自动系统的指示操作。当计算机语音系统用其低沉单调的声音宣布每个选项时,我感觉自己正在慢慢地变老。如果按错了一个键,那么您就会永远迷失在自动计算机系统深不可测的迷宫中。
遗憾的是,如果您被迫使用屏幕阅读器,那么这正是您在访问几乎任何 Web 页时的体验。大多数 Web 站点都在每一页中包含一个导航栏,其中包含指向 Web 站点各个部分的链接列表。如果使用屏幕阅读器,则每当您打开页时,都必须逐个聆听这些导航链接中的各个链接。
通过对导航栏进行一处简单的修改,就可显著提高 Web 页的可访问性。只需添加一个用来跳过所有导航链接的方法。可以用“跳过导航”链接完成该工作。
例如,CNN Web 站点包含一个导航栏,其中列出了 CNN Web 站点的不同部分(World、U.S.、Weather 等等)。但是,CNN Web 站点的设计人员已经做了一件聪明的事情。如果查看页的源代码,则您将注意到导航栏上会出现以下链接。
当查看 CNN Web 站点的主页时,您绝对不会看到该链接。该链接中包含的图像是一幅透明的单像素图像。但是,如果您用屏幕阅读器访问该页,则会阅读与该图像相关联的替换文本。盲人可以选择跳过所有导航链接,并直接移至 Web 页的主要内容区域(这与在自动语音系统中按 0 并直接导航到话务员等效)。
“跳过导航”链接已经被集成到多个标准 ASP.NET 2.0 控件中。特别需要指出的是,Menu、TreeView、SiteMapPath、Wizard 和 CreateUserWizard 控件全都支持“跳过导航”链接。
例如,清单 5 中的页包含 ASP.NET Menu 控件。该控件用来显示指向该 Web 站点中其他页的链接列表。
清单 5. SiteMenu.aspx
<%@ Page Language="VB" %>
Skip Navigation
如果查看清单 5 中页的源代码,您将看到以下链接出现在菜单顶部。
该链接包含一幅在您查看该页时不会出现的宽和高皆为零的图像。但是,通过屏幕阅读器访问该页的用户可以选择“跳过导航”链接跳到该菜单的结尾。
默认情况下,“跳过导航”链接包含文本 Skip Navigation Links。可以通过更改 Menu 控件的 SkipLinkText 属性修改该值。
创建可访问的数据
ASP.NET 2.0 框架包含一组丰富的、用于显示数据库数据的控件。这些控件包括 GridView、DetailsView、DataList、FormView 和 Repeater 控件。默认情况下,GridView、DetailsView 和 DataList 控件在 HTML 表中显示数据库记录。
在 HTML 表中呈现信息时,如果操作错误,则可能引起可访问性问题。在聆听 HTML 表的内容时,您很容易忘记自己当前在该表中的位置。例如,假设您使用 HTML 表显示一个产品信息列表。在聆听由屏幕阅读器朗读的表内容时,您很容易将某个表单元格所代表的信息搞混,不知道它们是有关产品名称的,还是有关所订购产品数量的,抑或是有关存储这些产品的仓库的代码。
在查看 HTML 表时,可通过扫视列或行标题来确定特定单元格的含义。为使表对于使用屏幕阅读器的用户是可访问的,需要显式标记表标题并将这些标题与各个单元格显式关联起来。
在创建表以显示数据时,应当始终使用正确的标记来标记列和行标题。表标题应当总是用