5
5
* Use of this source code is governed by an MIT-style license that can be
6
6
* found in the LICENSE file at https://angular.io/license
7
7
*/
8
-
9
8
import { ElementRef , NgZone } from '@angular/core' ;
10
- import { Platform } from '@angular/cdk/platform' ;
9
+ import { Platform , supportsPassiveEventListeners } from '@angular/cdk/platform' ;
11
10
import { RippleRef , RippleState } from './ripple-ref' ;
12
11
13
12
@@ -70,12 +69,12 @@ export class RippleRenderer {
70
69
this . _containerElement = elementRef . nativeElement ;
71
70
72
71
// Specify events which need to be registered on the trigger.
73
- this . _triggerEvents . set ( 'mousedown' , this . onMousedown . bind ( this ) ) ;
74
- this . _triggerEvents . set ( 'mouseup' , this . onPointerUp . bind ( this ) ) ;
75
- this . _triggerEvents . set ( 'mouseleave' , this . onPointerUp . bind ( this ) ) ;
72
+ this . _triggerEvents . set ( 'mousedown' , this . onMousedown ) ;
73
+ this . _triggerEvents . set ( 'mouseup' , this . onPointerUp ) ;
74
+ this . _triggerEvents . set ( 'mouseleave' , this . onPointerUp ) ;
76
75
77
- this . _triggerEvents . set ( 'touchstart' , this . onTouchStart . bind ( this ) ) ;
78
- this . _triggerEvents . set ( 'touchend' , this . onPointerUp . bind ( this ) ) ;
76
+ this . _triggerEvents . set ( 'touchstart' , this . onTouchStart ) ;
77
+ this . _triggerEvents . set ( 'touchend' , this . onPointerUp ) ;
79
78
80
79
// By default use the host element as trigger element.
81
80
this . setTriggerElement ( this . _containerElement ) ;
@@ -170,25 +169,27 @@ export class RippleRenderer {
170
169
171
170
/** Sets the trigger element and registers the mouse events. */
172
171
setTriggerElement ( element : HTMLElement | null ) {
172
+ const eventOptions = supportsPassiveEventListeners ( ) ? ( { passive : true } as any ) : false ;
173
+
173
174
// Remove all previously register event listeners from the trigger element.
174
175
if ( this . _triggerElement ) {
175
176
this . _triggerEvents . forEach ( ( fn , type ) => {
176
- this . _triggerElement ! . removeEventListener ( type , fn ) ;
177
+ this . _triggerElement ! . removeEventListener ( type , fn , eventOptions ) ;
177
178
} ) ;
178
179
}
179
180
180
181
if ( element ) {
181
182
// If the element is not null, register all event listeners on the trigger element.
182
183
this . _ngZone . runOutsideAngular ( ( ) => {
183
- this . _triggerEvents . forEach ( ( fn , type ) => element . addEventListener ( type , fn ) ) ;
184
+ this . _triggerEvents . forEach ( ( fn , type ) => element . addEventListener ( type , fn , eventOptions ) ) ;
184
185
} ) ;
185
186
}
186
187
187
188
this . _triggerElement = element ;
188
189
}
189
190
190
191
/** Function being called whenever the trigger is being pressed using mouse. */
191
- private onMousedown ( event : MouseEvent ) {
192
+ private onMousedown = ( event : MouseEvent ) => {
192
193
const isSyntheticEvent = this . _lastTouchStartEvent &&
193
194
Date . now ( ) < this . _lastTouchStartEvent + IGNORE_MOUSE_EVENTS_TIMEOUT ;
194
195
@@ -199,7 +200,7 @@ export class RippleRenderer {
199
200
}
200
201
201
202
/** Function being called whenever the trigger is being pressed using touch. */
202
- private onTouchStart ( event : TouchEvent ) {
203
+ private onTouchStart = ( event : TouchEvent ) => {
203
204
if ( ! this . rippleDisabled ) {
204
205
// Some browsers fire mouse events after a `touchstart` event. Those synthetic mouse
205
206
// events will launch a second ripple if we don't ignore mouse events for a specific
@@ -212,7 +213,7 @@ export class RippleRenderer {
212
213
}
213
214
214
215
/** Function being called whenever the trigger is being released. */
215
- private onPointerUp ( ) {
216
+ private onPointerUp = ( ) => {
216
217
if ( ! this . _isPointerDown ) {
217
218
return ;
218
219
}
0 commit comments