|
6 | 6 | * found in the LICENSE file at https://angular.io/license
|
7 | 7 | */
|
8 | 8 |
|
9 |
| -import {Platform} from '@angular/cdk/platform'; |
| 9 | +import {Platform, normalizePassiveListenerOptions} from '@angular/cdk/platform'; |
10 | 10 | import {
|
11 | 11 | ChangeDetectionStrategy,
|
12 | 12 | Component,
|
@@ -57,6 +57,21 @@ export interface MatCalendarUserEvent<D> {
|
57 | 57 |
|
58 | 58 | let calendarBodyId = 1;
|
59 | 59 |
|
| 60 | +/** Event options that can be used to bind an active, capturing event. */ |
| 61 | +const activeCapturingEventOptions = normalizePassiveListenerOptions({ |
| 62 | + passive: false, |
| 63 | + capture: true, |
| 64 | +}); |
| 65 | + |
| 66 | +/** Event options that can be used to bind a passive, capturing event. */ |
| 67 | +const passiveCapturingEventOptions = normalizePassiveListenerOptions({ |
| 68 | + passive: true, |
| 69 | + capture: true, |
| 70 | +}); |
| 71 | + |
| 72 | +/** Event options that can be used to bind a passive, non-capturing event. */ |
| 73 | +const passiveEventOptions = normalizePassiveListenerOptions({passive: true}); |
| 74 | + |
60 | 75 | /**
|
61 | 76 | * An internal component used to display calendar data in a table.
|
62 | 77 | * @docs-private
|
@@ -174,13 +189,17 @@ export class MatCalendarBody<D = any> implements OnChanges, OnDestroy, AfterView
|
174 | 189 | constructor(private _elementRef: ElementRef<HTMLElement>, private _ngZone: NgZone) {
|
175 | 190 | _ngZone.runOutsideAngular(() => {
|
176 | 191 | const element = _elementRef.nativeElement;
|
177 |
| - element.addEventListener('mouseenter', this._enterHandler, true); |
178 |
| - element.addEventListener('touchmove', this._touchmoveHandler, true); |
179 |
| - element.addEventListener('focus', this._enterHandler, true); |
180 |
| - element.addEventListener('mouseleave', this._leaveHandler, true); |
181 |
| - element.addEventListener('blur', this._leaveHandler, true); |
182 |
| - element.addEventListener('mousedown', this._mousedownHandler); |
183 |
| - element.addEventListener('touchstart', this._mousedownHandler); |
| 192 | + |
| 193 | + // `touchmove` is active since we need to call `preventDefault`. |
| 194 | + element.addEventListener('touchmove', this._touchmoveHandler, activeCapturingEventOptions); |
| 195 | + |
| 196 | + element.addEventListener('mouseenter', this._enterHandler, passiveCapturingEventOptions); |
| 197 | + element.addEventListener('focus', this._enterHandler, passiveCapturingEventOptions); |
| 198 | + element.addEventListener('mouseleave', this._leaveHandler, passiveCapturingEventOptions); |
| 199 | + element.addEventListener('blur', this._leaveHandler, passiveCapturingEventOptions); |
| 200 | + |
| 201 | + element.addEventListener('mousedown', this._mousedownHandler, passiveEventOptions); |
| 202 | + element.addEventListener('touchstart', this._mousedownHandler, passiveEventOptions); |
184 | 203 |
|
185 | 204 | if (this._platform.isBrowser) {
|
186 | 205 | window.addEventListener('mouseup', this._mouseupHandler);
|
@@ -232,13 +251,16 @@ export class MatCalendarBody<D = any> implements OnChanges, OnDestroy, AfterView
|
232 | 251 |
|
233 | 252 | ngOnDestroy() {
|
234 | 253 | const element = this._elementRef.nativeElement;
|
235 |
| - element.removeEventListener('mouseenter', this._enterHandler, true); |
236 |
| - element.removeEventListener('touchmove', this._touchmoveHandler, true); |
237 |
| - element.removeEventListener('focus', this._enterHandler, true); |
238 |
| - element.removeEventListener('mouseleave', this._leaveHandler, true); |
239 |
| - element.removeEventListener('blur', this._leaveHandler, true); |
240 |
| - element.removeEventListener('mousedown', this._mousedownHandler); |
241 |
| - element.removeEventListener('touchstart', this._mousedownHandler); |
| 254 | + |
| 255 | + element.removeEventListener('touchmove', this._touchmoveHandler, activeCapturingEventOptions); |
| 256 | + |
| 257 | + element.removeEventListener('mouseenter', this._enterHandler, passiveCapturingEventOptions); |
| 258 | + element.removeEventListener('focus', this._enterHandler, passiveCapturingEventOptions); |
| 259 | + element.removeEventListener('mouseleave', this._leaveHandler, passiveCapturingEventOptions); |
| 260 | + element.removeEventListener('blur', this._leaveHandler, passiveCapturingEventOptions); |
| 261 | + |
| 262 | + element.removeEventListener('mousedown', this._mousedownHandler, passiveEventOptions); |
| 263 | + element.removeEventListener('touchstart', this._mousedownHandler, passiveEventOptions); |
242 | 264 |
|
243 | 265 | if (this._platform.isBrowser) {
|
244 | 266 | window.removeEventListener('mouseup', this._mouseupHandler);
|
|
0 commit comments