Last updated October 21, 2013. Created by jessebeach on April 17, 2013.
Edited by Gábor Hojtsy, Wim Leers. Log in to edit this page.

These tools are under active development in Drupal 8. This documentation page may be out of date

Announce page updates aurally

Many page updates are expressed visually through color changes and animations. In order to make page updates apparent in a non-visual way, Drupal provides the Drupal.announce JavaScript method. This method creates an aria-live element on the page. Text appended to this node is read by a screen-reading user agent.

Drupal.announce accepts a string to be read by an audio UA. You can also set a second parameter: the priority. Here are a couple examples:

Drupal.announce('Entering edit mode');
Drupal.announce('Please fill in your user name', 'assertive');
Drupal.announce('You look beautiful today.');

The two accepted priority values are polite and assertive. polite is the default.

Assertive statements will interrupt any current speech. Polite statements will not interrupt the user agent. There is a chance they will not be read at all if many things on the page change at once. The announce feature will itself concatenate several calls and read several strings at once to ensure that multiple simultaneous updates are expressed to the end user.

Constrain tabbing

For some interactions, you may want to guide a non-visual user to the salient elements on the page. For instance, the Overlay module constrains tabbing to elements in the overlay element and the toolbar. The Contextual module constrains tabbing to the contextual links when the global edit mode is enabled.

These modules achieve this constrained tabbing with the Drupal.TabbingManager JavaScript feature. To constrain tabbing on the page, invoke the tabbing manager feature like this.

var tabbingContext = Drupal.TabbingManager.constrain($('.contextual-toolbar-tab, .contextual'));

A set of elements is passed to the constrain method. Pressing the tabbing key will now only move between the tabbable elements in this set of elements.

To remove the tabbing constraint, the release method must be called on the tabbing context object.

tabbingContext.release();

The Overlay module uses two functions to initiate a tabbing constraint and release the constraint:

/**
* Makes elements outside the overlay unreachable via the tab key.
*/
Drupal.overlay.constrainTabbing = function ($tabbables) {
  // If a tabset is already active, return without creating a new one.
  if (this.tabset && !this.tabset.isReleased()) {
    return;
  }
  // Leave links inside the overlay and toolbars alone.
  this.tabset = Drupal.TabbingManager.constrain($tabbables);
  var self = this;
  $(document).on('drupalOverlayClose.tabbing', function () {
    self.tabset.release();
    $(document).off('drupalOverlayClose.tabbing');
  });
};
/**
*
*/
Drupal.overlay.releaseTabbing = function () {
  if (this.tabset) {
    this.tabset.release();
    delete this.tabset;
  }
};

Only one tabbing constraint may be active at a time. If a tabbing constraint is active and another is invoked, the previously active tabbing constraint will be disabled and the new one applied. You need only worry about the tabbing constraint that your module controls.
If another module overrides your tabbing constraint and then releases this constraint, then your module's tabbing constraint will be reapplied. In this case, if your module releases its tabbing constraint while its tabbing constraint is disabled (meaning another module has an active tabbing constraint), then it will not be reapplied, as you would expect.

Devel accessibility

The Devel accessibility (devel_a11y) module was created to aid with implementing, understanding and testing the above accessibility functionality.
It provides browser console logging of announcements and visualization of tabbing constraints.

For example, this is how it helps with visualizing tabbing constraints:

Looking for support? Visit the Drupal.org forums, or join #drupal-support in IRC.