@@ -29,10 +29,29 @@ export default class Home extends React.Component {
29
29
this . connectToBridge ( ) ;
30
30
this . updatePreviewText ( ) ;
31
31
this . addChangeListener ( ) ;
32
- this . addScrollListeners ( ) ;
33
32
34
33
this . configureResizer ( ) ;
35
34
this . addTabHandler ( ) ;
35
+
36
+ this . scrollTriggers = { } ;
37
+ this . scrollHandlers = [
38
+ { el : this . editor , handler : this . scrollHandler ( this . editor , this . preview ) } ,
39
+ { el : this . preview , handler : this . scrollHandler ( this . preview , this . editor ) }
40
+ ] ;
41
+ }
42
+
43
+ componentWillUpdate ( nextProps , nextState ) {
44
+ var prevMode = this . state . mode . mode ;
45
+ var nextMode = nextState . mode . mode ;
46
+
47
+ // If we changed to Split mode we add the scroll listeners
48
+ if ( prevMode !== nextMode ) {
49
+ if ( nextMode === SplitMode ) {
50
+ this . addScrollListeners ( ) ;
51
+ } else {
52
+ this . removeScrollListeners ( ) ;
53
+ }
54
+ }
36
55
}
37
56
38
57
setModeFromModeValue ( value ) {
@@ -149,26 +168,40 @@ export default class Home extends React.Component {
149
168
}
150
169
151
170
addScrollListeners ( ) {
152
- this . scrollTriggers = { } ;
153
- this . syncScroll ( this . editor , this . preview ) ;
154
- this . syncScroll ( this . preview , this . editor ) ;
171
+ this . scrollHandlers . forEach ( ( { el, handler} ) => el . addEventListener ( 'scroll' , handler ) ) ;
155
172
}
156
173
157
- syncScroll ( source , destination ) {
158
- source . addEventListener ( 'scroll' , ( event ) => {
174
+ removeScrollListeners ( ) {
175
+ this . scrollHandlers . forEach ( ( { el, handler} ) => el . removeEventListener ( 'scroll' , handler ) ) ;
176
+ }
177
+
178
+ scrollHandler = ( source , destination ) => {
179
+ var frameRequested ;
180
+
181
+ return ( event ) => {
159
182
// Avoid the cascading effect by not handling the event if it was triggered initially by this element
160
- if ( this . scrollTriggers [ source ] === true ) {
183
+ if ( this . scrollTriggers [ source ] === true ) {
161
184
this . scrollTriggers [ source ] = false ;
162
185
return ;
163
186
}
164
187
this . scrollTriggers [ source ] = true ;
165
188
166
- var target = event . target
167
- var height = target . scrollHeight - target . clientHeight ;
168
- var ratio = parseFloat ( target . scrollTop ) / height ;
169
- var move = ( destination . scrollHeight - destination . clientHeight ) * ratio ;
170
- destination . scrollTop = move ;
171
- } )
189
+ // Only request the animation frame once until it gets processed
190
+ if ( frameRequested ) {
191
+ return ;
192
+ }
193
+ frameRequested = true ;
194
+
195
+ window . requestAnimationFrame ( ( ) => {
196
+ var target = event . target
197
+ var height = target . scrollHeight - target . clientHeight ;
198
+ var ratio = parseFloat ( target . scrollTop ) / height ;
199
+ var move = ( destination . scrollHeight - destination . clientHeight ) * ratio ;
200
+ destination . scrollTop = move ;
201
+
202
+ frameRequested = false ;
203
+ } ) ;
204
+ }
172
205
}
173
206
174
207
removeSelection ( ) {
0 commit comments