1
1
import React , { Component , PropTypes } from 'react' ;
2
2
3
- class ScrollLock extends Component {
3
+ const upKeys = [
4
+ 33 , // pageUp
5
+ 38 // arrowUp
6
+ ] ;
7
+ const downKeys = [
8
+ 32 , // space
9
+ 34 , // pageDown
10
+ 40 // arrowDown
11
+ ] ;
12
+
13
+ export default class ScrollLock extends Component {
4
14
static propTypes = {
5
15
enabled : PropTypes . bool ,
6
16
className : PropTypes . string
@@ -20,6 +30,7 @@ class ScrollLock extends Component {
20
30
'onWheelHandler' ,
21
31
'onTouchStartHandler' ,
22
32
'onTouchMoveHandler' ,
33
+ 'onKeyDownHandler' ,
23
34
'setScrollingElement' ,
24
35
'cancelScrollEvent'
25
36
] . forEach ( ( func ) => { this [ func ] = this [ func ] . bind ( this ) ; } ) ;
@@ -83,6 +94,14 @@ class ScrollLock extends Component {
83
94
this . handleEventDelta ( e , delta ) ;
84
95
}
85
96
97
+ onKeyDownHandler ( e ) {
98
+ if ( upKeys . indexOf ( e . keyCode ) >= 0 ) {
99
+ this . handleEventDelta ( e , - 1 ) ;
100
+ } else if ( downKeys . indexOf ( e . keyCode ) >= 0 ) {
101
+ this . handleEventDelta ( e , 1 ) ;
102
+ }
103
+ }
104
+
86
105
cancelScrollEvent ( e ) {
87
106
e . stopImmediatePropagation ( ) ;
88
107
e . preventDefault ( ) ;
@@ -93,21 +112,27 @@ class ScrollLock extends Component {
93
112
el . addEventListener ( 'wheel' , this . onWheelHandler , false ) ;
94
113
el . addEventListener ( 'touchstart' , this . onTouchStartHandler , false ) ;
95
114
el . addEventListener ( 'touchmove' , this . onTouchMoveHandler , false ) ;
115
+ el . addEventListener ( 'keydown' , this . onKeyDownHandler , false ) ;
96
116
}
97
117
98
118
stopListeningToScrollEvents ( el ) {
99
119
el . removeEventListener ( 'wheel' , this . onWheelHandler , false ) ;
100
120
el . removeEventListener ( 'touchstart' , this . onTouchStartHandler , false ) ;
101
121
el . removeEventListener ( 'touchmove' , this . onTouchMoveHandler , false ) ;
122
+ el . removeEventListener ( 'keydown' , this . onKeyDownHandler , false ) ;
102
123
}
103
124
104
125
render ( ) {
105
126
return (
106
127
< div className = { this . props . className } ref = { this . setScrollingElement } >
107
- { this . props . children }
128
+ { React . cloneElement (
129
+ this . props . children ,
130
+ {
131
+ tabIndex : 0 ,
132
+ style : { outline : 'none' }
133
+ }
134
+ ) }
108
135
</ div >
109
136
) ;
110
137
}
111
138
}
112
-
113
- export default ScrollLock ;
0 commit comments