5

我们正在调整我们的 Intranet Web 应用程序以符合 WCAG 2.0。该应用程序具有复杂控件的列表,但我无法通过屏幕读取来读取列表中的任何内容,但 labelDisplay 或列表的 labelFunction 返回的内容。

下面是一个简化的示例,屏幕阅读器和列表框读取“labelOne”,以及列表中每个项目的 labelFunction 的结果。

<?xml version="1.0"?>
<s:Application
        xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/mx"
        xmlns:access="accessibility.*">
    <fx:Script><![CDATA[
        private function listLabelFunction(item : Object) : String {
            return item.one;
        }
        ]]></fx:Script>
    <s:VGroup>
        <access:Label id="labelOne" text="This text will be read out!"/>

        <s:List hasFocusableChildren="true" labelFunction="listLabelFunction">
            <s:itemRenderer>
                <fx:Component>
                    <s:ItemRenderer>
                        <fx:Script><![CDATA[
                            import mx.controls.Alert;
                            ]]></fx:Script>
                        <s:HGroup id="hGroup">
                            <access:Label id="labelDisplay" text="{data.one}"/>
                            <access:Label id="labelTwo" text="{data.two}"/>
                            <s:Button id="button" label="{data.button}" click="Alert.show('Ok!')"/>
                        </s:HGroup>
                    </s:ItemRenderer>
                </fx:Component>
            </s:itemRenderer>
            <s:dataProvider>
                <mx:ArrayCollection>
                    <fx:Object one="one" two="two" button="ok"/>
                    <fx:Object one="une" two="deux" button="ok"/>
                    <fx:Object one="uno" two="due" button="ok"/>
                    <fx:Object one="um" two="dois" button="ok"/>
                </mx:ArrayCollection>
            </s:dataProvider>
        </s:List>
    </s:VGroup>
</s:Application>

“访问标签”;确保标签被读出并按标签顺序排列。

package accessibility {
import mx.managers.IFocusManagerComponent;

import spark.components.Label;

public class Label extends spark.components.Label implements IFocusManagerComponent {
}
}

我也可以标记列表中的每个项目,即“labelDisplay”、“labelTwo”和“button”,但屏幕阅读器不会读出它们。

是否可以读出每个标签和按钮?

4

1 回答 1

1

我有一些建议,但我不知道它们是否有效(我的屏幕阅读器在清洁工处)。

首先,您可能会在这里从课堂上找到一些有趣的阅读材料,了解课堂如何使用屏幕阅读器。特别要注意关于子对象(渲染器)的部分中的这句话:ListAccImplList

...列表项的可访问性由列表管理;Flash Player 会忽略项呈现器的accessibilityImplementation 和accessibilityProperties。

这就解释了为什么屏幕阅读器只读labelDisplaylabelFunction. 即使您已经在渲染器中聚焦了一个对象,看起来List仍然可以控制屏幕阅读器。AccImpl类的文档(也来自子部分)进一步证实了这一点:

Flash Player 不支持可访问对象的真正层次结构。如果 DisplayObject 具有 accessibilityImplementation 对象,则忽略其子项的 accessibilityImplementation 对象。

建议

  • 尝试将 的focusEnabled属性设置Listfalse。当您通过 UI 切换时,渲染器中的对象仍将获得焦点,但其List本身不会。正如文档AccImpl似乎暗示的那样,List因此不会管理与屏幕阅读器的交互,它将被推迟到渲染器中的可聚焦对象。

  • 尝试扩展List类,并覆盖它的initializeAccessibility()方法。这个方法(我假设)由 Flex 组件生命周期调用,并且是列表能够与屏幕阅读器交互的地方。如果您不初始化可访问性实现,我的想法是它会将责任推迟到渲染器中的对象。否则它可能会崩溃和燃烧。

这就是我所得到的,希望它有所帮助......好问题,请分享你的发现。

于 2013-07-02T02:20:57.490 回答