Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 (function(){ | 1 (function(){ |
2 document.addEventListener("DOMContentLoaded", function() | 2 document.addEventListener("DOMContentLoaded", function() |
3 { | 3 { |
4 | 4 |
5 // Change html class name from "no-js" to "js" | 5 // Change html class name from "no-js" to "js" |
6 document.documentElement.className = "js"; | 6 document.documentElement.className = "js"; |
7 | 7 |
8 // Toggle Navbar Collapse | 8 // Toggle Navbar Collapse |
9 function toggleNavbarCollapse() | 9 function toggleNavbarCollapse() |
10 { | 10 { |
11 var navbarCollapseEls = this.parentElement.getElementsByClassName("navbar- collapse"); | 11 var navbarCollapseEls = this.parentElement.getElementsByClassName("navbar- collapse"); |
12 for (var i = 0; i < navbarCollapseEls.length; i++) | 12 for (var i = 0; i < navbarCollapseEls.length; i++) |
13 { | 13 { |
14 navbarCollapseEls[i] | 14 navbarCollapseEls[i] |
15 .classList.toggle("open") | 15 .classList.toggle("open") |
16 } | 16 } |
17 } | 17 } |
18 | 18 |
19 var toggleNavbarCollapseEls = document.getElementsByClassName("toggle-navbar -collapse"); | 19 var toggleNavbarCollapseEls = document.getElementsByClassName("toggle-navbar -collapse"); |
20 for (var i = 0; i < toggleNavbarCollapseEls.length; i++) | 20 for (var i = 0; i < toggleNavbarCollapseEls.length; i++) |
21 { | 21 { |
22 toggleNavbarCollapseEls[i] | 22 toggleNavbarCollapseEls[i] |
23 .addEventListener("click", toggleNavbarCollapse, false); | 23 .addEventListener("click", toggleNavbarCollapse, false); |
24 } | 24 } |
25 | 25 |
26 // Custom Select | |
27 function onClickCustomSelect() | |
28 { | |
29 var options = this.nextElementSibling; | |
30 if (options.getAttribute("aria-hidden") == "true") | |
31 { | |
32 options.removeAttribute("aria-hidden"); | |
33 this.setAttribute("aria-expanded", "true"); | |
34 } | |
35 else | |
36 { | |
37 options.setAttribute("aria-hidden", "true"); | |
38 this.setAttribute("aria-expanded", "false"); | |
39 } | |
40 } | |
41 | |
42 var customSelectEls = document.getElementsByClassName('custom-select-selecte d'); | |
43 for (var i = 0; i < customSelectEls.length; i++) | |
44 { | |
45 customSelectEls[i] | |
46 .addEventListener("click", onClickCustomSelect, false); | |
47 customSelectEls[i] | |
48 .nextElementSibling | |
49 .setAttribute("aria-hidden", "true"); | |
50 } | |
51 | |
26 // Accordion menu | 52 // Accordion menu |
27 | 53 |
28 function setupAccordionMenu(accordionEl) | 54 function Accordion(accordion) |
29 { | 55 { |
30 var accordionButtons = accordionEl.getElementsByClassName('accordion-toggl e-button'); | 56 this.accordion = accordion; |
31 for ( var i = 0; i < accordionButtons.length; i++ ) { | 57 |
32 accordionButtons[i].addEventListener("click", toggleAccordionSection, fa lse); | 58 var accordionButtons = this.accordion.getElementsByClassName('accordion-to ggle-button'); |
33 if ( i !== 0 ) { | 59 for (var i = 0; i < accordionButtons.length; i++) |
60 { | |
61 // Close all sections except the first | |
62 if (i !== 0) | |
63 { | |
34 accordionButtons[i].setAttribute("aria-expanded", "false"); | 64 accordionButtons[i].setAttribute("aria-expanded", "false"); |
35 accordionButtons[i].setAttribute("aria-disabled", "false"); | |
36 document | 65 document |
37 .getElementById( accordionButtons[i].getAttribute("aria-controls") ) | 66 .getElementById( accordionButtons[i].getAttribute("aria-controls") ) |
juliandoucette
2017/10/09 21:18:16
NIT: Extra whitespace inside brackets
(The same a
| |
38 .setAttribute("hidden", "true"); | 67 .setAttribute("hidden", "true"); |
ire
2017/09/18 10:08:11
See https://issues.adblockplus.org/ticket/5703 reg
juliandoucette
2017/09/18 12:53:31
Acknowledged.
| |
39 } | 68 } |
40 } | 69 } |
70 | |
71 this.accordion | |
72 .addEventListener("click", this._onClick.bind(this), false); | |
73 this.accordion | |
74 .addEventListener("keydown", this._onKeyDown.bind(this), false); | |
41 } | 75 } |
42 | 76 |
43 function toggleAccordionSection() | 77 Accordion.prototype.toggleSection = function(clickedButton) |
44 { | 78 { |
45 // Hide currently expanded section | 79 // Hide currently expanded section |
46 var accordion = this.parentElement.parentElement; | 80 var expandedButton = this.accordion.querySelector("button[aria-expanded='t rue']"); |
47 var expandedButton = accordion.querySelector("button[aria-expanded='true'] "); | 81 if (expandedButton) |
48 expandedButton.setAttribute("aria-expanded", "false"); | 82 { |
49 expandedButton.setAttribute("aria-disabled", "false"); | 83 expandedButton.setAttribute("aria-expanded", "false"); |
50 document | 84 document |
51 .getElementById( expandedButton.getAttribute("aria-controls") ) | 85 .getElementById( expandedButton.getAttribute("aria-controls") ) |
52 .setAttribute("hidden", "true"); | 86 .setAttribute("hidden", "true"); |
87 } | |
88 | |
89 // If currently expanded section is clicked | |
90 if (expandedButton === clickedButton) return; | |
53 | 91 |
54 // Expand new section | 92 // Expand new section |
55 this.setAttribute("aria-expanded", "true"); | 93 clickedButton.setAttribute("aria-expanded", "true"); |
56 this.setAttribute("aria-disabled", "true"); | |
57 document | 94 document |
58 .getElementById( this.getAttribute("aria-controls") ) | 95 .getElementById( clickedButton.getAttribute("aria-controls") ) |
59 .removeAttribute("hidden"); | 96 .removeAttribute("hidden"); |
60 } | 97 } |
61 | 98 |
62 var accordionMenus = document.getElementsByClassName('accordion'); | 99 Accordion.prototype.focusNextSection = function() |
63 for (var i = 0; i < accordionMenus.length; i++) | |
64 { | 100 { |
65 setupAccordionMenu( accordionMenus[i] ); | 101 var currentFocus = document.activeElement; |
102 var nextheading = currentFocus.parentElement.nextElementSibling.nextElemen tSibling; | |
103 | |
104 if (nextheading) | |
105 { | |
106 nextheading // .accordion-heading | |
107 .firstElementChild // .accordion-toggle-button | |
108 .focus(); | |
109 } | |
110 else | |
111 { | |
112 this.accordion | |
113 .firstElementChild // .accordion-heading | |
114 .firstElementChild // .accordion-toggle-button | |
115 .focus(); | |
116 } | |
117 } | |
118 | |
119 Accordion.prototype.focusPrevSection = function() | |
120 { | |
121 var currentFocus = document.activeElement; | |
122 var prevAccordionBody = currentFocus.parentElement.previousElementSibling; | |
123 | |
124 if (prevAccordionBody) | |
125 { | |
126 prevAccordionBody // .accordion-body | |
127 .previousElementSibling // .accordion-heading | |
128 .firstElementChild // .accordion-toggle-button | |
129 .focus(); | |
130 } | |
131 else | |
132 { | |
133 this.accordion | |
134 .lastElementChild // .accordion-body | |
135 .previousElementSibling // .accordion-heading | |
136 .firstElementChild // .accordion-toggle-button | |
137 .focus(); | |
138 } | |
139 } | |
140 | |
141 Accordion.prototype._onKeyDown = function(event) | |
142 { | |
143 if (!event.target.classList.contains("accordion-toggle-button")) return; | |
144 | |
145 if (event.key == "ArrowUp" || event.keyCode == 38) | |
146 { | |
147 this.focusPrevSection(); | |
148 } | |
149 else if (event.key == "ArrowDown" || event.keyCode == 40) | |
150 { | |
151 this.focusNextSection(); | |
152 } | |
153 } | |
154 | |
155 Accordion.prototype._onClick = function(event) | |
156 { | |
157 if (!event.target.classList.contains("accordion-toggle-button")) return; | |
158 | |
159 this.toggleSection(event.target); | |
160 } | |
161 | |
162 var accordions = document.getElementsByClassName('accordion'); | |
163 for (var i = 0; i < accordions.length; i++) | |
164 { | |
165 new Accordion(accordions[i]); | |
66 } | 166 } |
ire
2017/09/18 10:08:11
This will be refactored in https://issues.adblockp
juliandoucette
2017/09/18 12:53:31
Acknowledged.
| |
67 | 167 |
68 }, false); | 168 }, false); |
69 }()); | 169 }()); |
LEFT | RIGHT |