123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- /*
- * This content is licensed according to the W3C Software License at
- * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
- *
- * File: tabs-automatic.js
- *
- * Desc: Tablist widget that implements ARIA Authoring Practices
- */
- 'use strict';
- class TabsAutomatic {
- constructor(groupNode) {
- this.tablistNode = groupNode;
- this.tabs = [];
- this.firstTab = null;
- this.lastTab = null;
- this.tabs = Array.from(this.tablistNode.querySelectorAll('[role=tab]'));
- this.tabpanels = [];
- for (var i = 0; i < this.tabs.length; i += 1) {
- var tab = this.tabs[i];
- var tabpanel = document.getElementById(tab.getAttribute('aria-controls'));
- tab.tabIndex = -1;
- tab.setAttribute('aria-selected', 'false');
- this.tabpanels.push(tabpanel);
- tab.addEventListener('keydown', this.onKeydown.bind(this));
- tab.addEventListener('click', this.onClick.bind(this));
- if (!this.firstTab) {
- this.firstTab = tab;
- }
- this.lastTab = tab;
- }
- this.setSelectedTab(this.firstTab, false);
- }
- setSelectedTab(currentTab, setFocus) {
- if (typeof setFocus !== 'boolean') {
- setFocus = true;
- }
- for (var i = 0; i < this.tabs.length; i += 1) {
- var tab = this.tabs[i];
- if (currentTab === tab) {
- tab.setAttribute('aria-selected', 'true');
- tab.removeAttribute('tabindex');
- this.tabpanels[i].classList.remove('is-hidden');
- if (setFocus) {
- tab.focus();
- }
- } else {
- tab.setAttribute('aria-selected', 'false');
- tab.tabIndex = -1;
- this.tabpanels[i].classList.add('is-hidden');
- }
- }
- }
- setSelectedToPreviousTab(currentTab) {
- var index;
- if (currentTab === this.firstTab) {
- this.setSelectedTab(this.lastTab);
- } else {
- index = this.tabs.indexOf(currentTab);
- this.setSelectedTab(this.tabs[index - 1]);
- }
- }
- setSelectedToNextTab(currentTab) {
- var index;
- if (currentTab === this.lastTab) {
- this.setSelectedTab(this.firstTab);
- } else {
- index = this.tabs.indexOf(currentTab);
- this.setSelectedTab(this.tabs[index + 1]);
- }
- }
- /* EVENT HANDLERS */
- onKeydown(event) {
- var tgt = event.currentTarget,
- flag = false;
- switch (event.key) {
- case 'ArrowLeft':
- this.setSelectedToPreviousTab(tgt);
- flag = true;
- break;
- case 'ArrowRight':
- this.setSelectedToNextTab(tgt);
- flag = true;
- break;
- case 'Home':
- this.setSelectedTab(this.firstTab);
- flag = true;
- break;
- case 'End':
- this.setSelectedTab(this.lastTab);
- flag = true;
- break;
- default:
- break;
- }
- if (flag) {
- event.stopPropagation();
- event.preventDefault();
- }
- }
- onClick(event) {
- this.setSelectedTab(event.currentTarget);
- }
- }
- // Initialize tablist
- window.addEventListener('load', function () {
- var tablists = document.querySelectorAll('[role=tablist].automatic');
- for (var i = 0; i < tablists.length; i++) {
- new TabsAutomatic(tablists[i]);
- }
- });
|