11import React , { Component , PropTypes } from 'react' ;
22
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 {
414 static propTypes = {
515 enabled : PropTypes . bool ,
616 className : PropTypes . string
@@ -20,6 +30,7 @@ class ScrollLock extends Component {
2030 'onWheelHandler' ,
2131 'onTouchStartHandler' ,
2232 'onTouchMoveHandler' ,
33+ 'onKeyDownHandler' ,
2334 'setScrollingElement' ,
2435 'cancelScrollEvent'
2536 ] . forEach ( ( func ) => { this [ func ] = this [ func ] . bind ( this ) ; } ) ;
@@ -83,6 +94,14 @@ class ScrollLock extends Component {
8394 this . handleEventDelta ( e , delta ) ;
8495 }
8596
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+
86105 cancelScrollEvent ( e ) {
87106 e . stopImmediatePropagation ( ) ;
88107 e . preventDefault ( ) ;
@@ -93,21 +112,27 @@ class ScrollLock extends Component {
93112 el . addEventListener ( 'wheel' , this . onWheelHandler , false ) ;
94113 el . addEventListener ( 'touchstart' , this . onTouchStartHandler , false ) ;
95114 el . addEventListener ( 'touchmove' , this . onTouchMoveHandler , false ) ;
115+ el . addEventListener ( 'keydown' , this . onKeyDownHandler , false ) ;
96116 }
97117
98118 stopListeningToScrollEvents ( el ) {
99119 el . removeEventListener ( 'wheel' , this . onWheelHandler , false ) ;
100120 el . removeEventListener ( 'touchstart' , this . onTouchStartHandler , false ) ;
101121 el . removeEventListener ( 'touchmove' , this . onTouchMoveHandler , false ) ;
122+ el . removeEventListener ( 'keydown' , this . onKeyDownHandler , false ) ;
102123 }
103124
104125 render ( ) {
105126 return (
106127 < 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+ ) }
108135 </ div >
109136 ) ;
110137 }
111138}
112-
113- export default ScrollLock ;
0 commit comments