4

我正在开发一个使用 iFrame 的 Web 应用程序(请不要让我使用其他东西,而不是我的决定)。有两个框架,一个导航框架和一个内容框架(自上而下)。

导航框架始终保持不变。当用户单击链接导致内容框架中的内容发生更改时,JAWS 什么也不做。我想让 JAWS 做的是宣布新页面的内容(至少是标题)。

我查看了 WAI-ARIA 标记,并尝试了各种 JavaScript 技巧来命令将焦点集中在元素上。 唯一有效的方法是执行以下操作

<iframe id="contF" aria-atomic="true" aria-live="assertive" frameborder="0" name="content" title="${ca.title}" src="${ca.src}"></iframe>

这将导致 JAWS 在首次加载框架时宣布框架的内容(因此之前从未单击过该链接)。如果是“访问过的链接”,则根本不会公布框架的内容。

4

2 回答 2

1

我知道这是一个非常古老的帖子,但我会为有同样问题的人发布我的解决方案。在将在 iframe 上加载的所有页面中放置一个描述 div:

<div id="ac_title" style="display:inline-block;position:absolute;top:0;right:0;height:1px;width:1px">Page ZZZ loaded.</div>

index.html 中的以下代码:

window.frames["content"].onload = function() {
    var a = this.contentDocument.getElementById("ac_title");
    if (a) {
        a.setAttribute("role", "alert");
    }
};
于 2019-08-09T11:36:27.137 回答
0

我知道你要求不要要求改变任何东西,但你为什么要带两个iframes呢?我已经很多年没有处理过这个问题了,所以我很模糊。我想说的是,您可以将普通框架链接在一起,但不能将 iframe 链接在一起。

如果您添加target="content"到导航框架内的各种链接,它可能会起作用。

由于该属性和 iframe 的性质,原子属性不起作用。atomic 属性监视 DOM 更改并在更改时触发。所以对你的

<iframe id="contF" aria-atomic="true" aria-live="assertive" frameborder="0" 
name="content" title="${ca.title}" src="${ca.src}"></iframe>

什么都不做,因为这个 iframe 所在页面的 DOM 没有改变。

于 2012-11-19T14:01:08.370 回答