Skip to content

Commit 8b9456e

Browse files
authored
lock keyboard events that scroll the page (#13)
1 parent 59a53bf commit 8b9456e

File tree

4 files changed

+108
-12
lines changed

4 files changed

+108
-12
lines changed

lib/ScrollLock.js

Lines changed: 24 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/ScrollLock.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ScrollLock.jsx

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
import 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

Comments
 (0)