NVDA неправильно объявляет регионы aria-live

Я пытаюсь сделать приложение React максимально доступным. Однако я замечаю какое-то странное поведение с NVDA - у меня есть два активных региона, которые я просто не могу заставить NVDA правильно объявить. На закадровом озвучивании с ними все работает плавно.

Во-первых, есть компонент уведомления, который сгенерировал HTML-код, подобный этому. NVDA не объявляет уведомления, Voiceover делает:

<div aria-live="polite" aria-hidden="true/false">
  <article> <-- There might be many of these if there's multiple notifications, and there's none of these if there's no notifications
    <div>
      <div type="alert">
        <div>
          <div>The text here should be announced when shown</div>
        </div>
      </div>
    </div>
  </article>
</div>

Если я удалю aria-hidden из первого div, NVDA прочитает его, но он станет ненадежным в Voiceover. Внутри первого div есть компонент PoseGroup, который просто не отображается в сгенерированном HTML.

РЕДАКТИРОВАТЬ: Мне удалось заставить это работать, обернув все это в еще один div с aria-live = polite. Небольшое хакерское решение, но то, что вы знаете ... Если у кого-то есть лучшее решение, я слушаю.

Затем есть живой чат с таким HTML:

<div>
  <ul aria-live="polite"> <-- There are multiple of these depending on number of elements, but always at least one
    <li aria-hidden="true/false"> <--- There are many of these, some hidden from screen reader depending on the component, these are messages, timestamps etc, some of them should be read
      <div>
        <span>
          <div>
            <p aria-hidden="true">Visible message text</p>
            <p aria-hidden="false">Hidden visibility, but contains additional information to screen reader and should be read always</p>
         </div>
        </span>
      </div>
    </li>
  </ul>
</div>

Здесь я использую несколько контейнеров aria-live, которые создаются, когда в первом достаточно сообщений, это связано с тем, что Voiceover останавливает чтение, когда элементов слишком много, и это решение работает с этим. Следует также отметить, что есть компонент PoseGroup, обертывающий элементы li, он не отображается в сгенерированном HTML. Элементы li должны только читать сообщения, без отметок времени и т. Д., Поэтому они имеют aria-hidden. Что бы я ни пробовал, NVDA ничего из этого не читает. Закадровый голос отлично работает с таким кодом. Я безуспешно пытался преобразовать ul и li в div.

Затем есть компонент ввода формы, который имеет метку ошибки в качестве активной области, выглядит следующим образом:

<label>
  <span>Some text</span>
  <input/>
  <div aria-live="polite">
    <span>This span is conditionally shown if there's an error.</span>
  </div>
</label>

Однако этот компонент отлично работает как с Voiceover, так и с NVDA, и я просто не могу понять, почему два других этого не делают. Конечно, они более сложные, но разве это не должно работать и на NVDA, поскольку Voiceover делает это без каких-либо проблем?

Я до сих пор считаю себя новичком в области доступности и уже пару дней бьюсь головой о стену.


person Mika Laaksonen    schedule 23.07.2020    source источник


Ответы (1)


Живые регионы - это хорошо поддерживаемый и зрелый инструмент доступности, но это не самая интуитивно понятная вещь. Возможно, вы неправильно их используете.

Активные регионы объявляются только при изменении содержимого. Если во время загрузки страницы в активной области присутствует контент, он не будет объявлен, если этот контент не изменится.

Я не уверен, что вы используете aria-hidden в качестве переключателя для отображения / скрытия контента в активной области, но если да, то, вероятно, это источник ваших проблем. В вашем третьем примере этот метод не используется, и, похоже, он работает.

person Josh    schedule 23.07.2020
comment
Эта тестовая страница является хорошим ресурсом: terrillthompson.com/tests/aria/live-scores. html - person Josh; 24.07.2020