1
- // https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.0.9
1
+ // https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.1.0
2
2
3
3
export const candidateSelectors = [
4
4
'input' ,
@@ -20,12 +20,39 @@ function isHidden(node: any) {
20
20
) ;
21
21
}
22
22
23
+ function getCheckedRadio ( nodes : any , form : any ) {
24
+ for ( var i = 0 ; i < nodes . length ; i ++ ) {
25
+ if ( nodes [ i ] . checked && nodes [ i ] . form === form ) {
26
+ return nodes [ i ] ;
27
+ }
28
+ }
29
+ }
30
+
31
+ function isNotRadioOrTabbableRadio ( node : any ) {
32
+ if ( node . tagName !== 'INPUT' || node . type !== 'radio' || ! node . name ) {
33
+ return true ;
34
+ }
35
+ var radioScope = node . form || node . ownerDocument ;
36
+ var radioSet = radioScope . querySelectorAll (
37
+ 'input[type="radio"][name="' + node . name + '"]'
38
+ ) ;
39
+ var checked = getCheckedRadio ( radioSet , node . form ) ;
40
+ return checked === node || ( checked === undefined && radioSet [ 0 ] === node ) ;
41
+ }
42
+
23
43
export function getAllTabbingElements ( parentElem : any ) {
44
+ var currentActiveElement = document . activeElement ;
24
45
var tabbableNodes = parentElem . querySelectorAll ( candidateSelectors . join ( ',' ) ) ;
25
46
var onlyTabbable = [ ] ;
26
47
for ( var i = 0 ; i < tabbableNodes . length ; i ++ ) {
27
48
var node = tabbableNodes [ i ] ;
28
- if ( ! node . disabled && getTabindex ( node ) > - 1 && ! isHidden ( node ) ) {
49
+ if (
50
+ currentActiveElement === node ||
51
+ ( ! node . disabled &&
52
+ getTabindex ( node ) > - 1 &&
53
+ ! isHidden ( node ) &&
54
+ isNotRadioOrTabbableRadio ( node ) )
55
+ ) {
29
56
onlyTabbable . push ( node ) ;
30
57
}
31
58
}
0 commit comments