Code Monkey home page Code Monkey logo

aria-api's Introduction

aria-api

WAI-ARIA allows websites to provide additional semantics to assistive technologies. Roles and attributes can be set either explicitly (e.g. <span role="link">click me</span>) or implicitly (<a href="//example.com">click me</a> implicitly has the role "link").

While the implicit mappings make authoring accessible websites simpler, it makes the task of calculating an element's role and attributes more complicated. This library takes care of exactly that.

Install

npm install aria-api

This installation method works best if you use tools like webpack or browserify. There is also an UMD build included as dist/aria.js.

Usage

var aria = require('aria-api'):

aria.querySelector('landmark').forEach(function(landmark) {
    if (!aria.matches(landmark, ':hidden')) {
        var role = aria.getRole(landmark);
        var name = aria.getName(landmark);
        console.log(role, name);
    }
});

getRole(element)

Calculate an element's role.

Note that this will return only the most specific role. If you want to know whether an element has a role, use matches() instead.

getAttribute(element, attribute)

Calculate the value of an element's attribute (state or property). The "aria-" prefix is not included in the attribute name.

getName(element)

Calculate an element's name according to the Accessible Name and Description Computation.

getDescription(element)

Calculate an element's description according to the Accessible Name and Description Computation.

matches(element, selector)

Similar to Element.matches(), this allows to check whether an element matches a selector. A selector can be any of the following:

  • role: Matches if the element has the specified role. This also works for hierarchical roles such as "landmark".
  • :attribute: Matches if the attribute is truthy. The "aria-" prefix is not included in the attribute name.
  • [attribute="value"]: Matches if the value of the attribute converted to string equals the specified value.

Note that combinations of selectors are not supported (e.g. main link, link:hidden, :not(:hidden)). The single exception to this rule are comma-separated lists of roles, e.g. link,button.

querySelector(element, selector)

Similar to Element.querySelector(). See matches() for details.

querySelectorAll(element, selector)

Similar to Element.querySelectorAll(). See matches() for details.

closest(element, selector)

Similar to Element.closest(). See matches() for details.

getParentNode(node)

Similar to Node.parentNode, but takes aria-owns into account.

getChildNodes(node)

Similar to Node.childNodes, but takes aria-owns into account.

What is this for?

First of all, I thought that something like this should exist. I currently use it for a11y-outline, a web extension that generates outlines based on WAI-ARIA roles.

That said, this is what I think it could also be used for:

  • Providing features based on the additional information provided by ARIA, e.g. landmark navigation.
  • Tools helping developers with improving accessibility.

Implemented standards

I try to update the code whenever a new version of these specs becomes a recommendation.

Notes

  • This is a pet project. I do not have the time to do extensive testing and may skip some details now and then. I am happy to receive bug reports and pull requests though.
  • The standards are still in a very rough state. Many things are unclear/undecided and therefore no browser really implements them. So naturally, this library cannot really implement the standards either.
  • This library does not do any validity checks. Invalid attributes or roles will not produce any warnings.
  • In order to calculate the "hidden" attribute, Window.getComputedStyle() is called. This only seems to return reliable values if the element is attached to document.
  • Due to security restrictions it is not generally possible to inspect the content of iframes, so they are ignored.

Related projects

aria-api's People

Contributors

matatk avatar xi avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.