@@ -15,7 +15,14 @@ export class BehaviorController {
15
15
lastPosition ?: Vector ;
16
16
} ;
17
17
18
- public constructor ( private readonly documentOrShadowRoot : DocumentOrShadowRoot ) { }
18
+ public static create ( shadowRoot : ShadowRoot | undefined ) {
19
+ return new BehaviorController ( shadowRoot ?? document , shadowRoot ) ;
20
+ }
21
+
22
+ private constructor (
23
+ private readonly dom : Document | ShadowRoot ,
24
+ private readonly shadowRoot : ShadowRoot | undefined
25
+ ) { }
19
26
20
27
public start ( startPosition : Vector , behavior : Behavior ) {
21
28
if ( this . state ) {
@@ -29,42 +36,62 @@ export class BehaviorController {
29
36
} ;
30
37
behavior . onStart ( this . state . startPosition ) ;
31
38
32
- window . addEventListener ( 'mousemove' , this . onMouseMove , false ) ;
33
- window . addEventListener ( 'touchmove' , this . onTouchMove , nonPassiveOptions ) ;
34
- window . addEventListener ( 'mouseup' , this . onMouseUp , false ) ;
35
- window . addEventListener ( 'touchend' , this . onTouchEnd , nonPassiveOptions ) ;
36
- window . addEventListener ( 'touchstart' , this . onTouchStart , nonPassiveOptions ) ;
39
+ if ( this . shadowRoot ) {
40
+ this . bind ( this . shadowRoot ) ;
41
+ }
42
+ this . bind ( window ) ;
43
+ }
44
+
45
+ private bind ( target : EventTarget ) {
46
+ target . addEventListener ( 'mousemove' , this . onMouseMove , false ) ;
47
+ target . addEventListener ( 'touchmove' , this . onTouchMove , nonPassiveOptions ) ;
48
+ target . addEventListener ( 'mouseup' , this . onMouseUp , false ) ;
49
+ target . addEventListener ( 'touchend' , this . onTouchEnd , nonPassiveOptions ) ;
50
+ target . addEventListener ( 'touchstart' , this . onTouchStart , nonPassiveOptions ) ;
51
+ }
52
+
53
+ private unbind ( target : EventTarget ) {
54
+ target . removeEventListener ( 'mousemove' , this . onMouseMove , false ) ;
55
+ target . removeEventListener ( 'touchmove' , this . onTouchMove , nonPassiveOptions ) ;
56
+ target . removeEventListener ( 'mouseup' , this . onMouseUp , false ) ;
57
+ target . removeEventListener ( 'touchend' , this . onTouchEnd , nonPassiveOptions ) ;
58
+ target . removeEventListener ( 'touchstart' , this . onTouchStart , nonPassiveOptions ) ;
37
59
}
38
60
39
- private readonly onMouseMove = ( e : MouseEvent ) => {
61
+ private readonly onMouseMove = ( e : Event ) => {
40
62
e . preventDefault ( ) ;
41
- this . move ( readMousePosition ( e ) ) ;
63
+ e . stopPropagation ( ) ;
64
+ this . move ( readMousePosition ( e as MouseEvent ) ) ;
42
65
} ;
43
66
44
- private readonly onTouchMove = ( e : TouchEvent ) => {
67
+ private readonly onTouchMove = ( e : Event ) => {
45
68
e . preventDefault ( ) ;
46
- this . move ( readTouchPosition ( e ) ) ;
69
+ e . stopPropagation ( ) ;
70
+ this . move ( readTouchPosition ( e as TouchEvent ) ) ;
47
71
} ;
48
72
49
- private readonly onMouseUp = ( e : MouseEvent ) => {
73
+ private readonly onMouseUp = ( e : Event ) => {
50
74
e . preventDefault ( ) ;
75
+ e . stopPropagation ( ) ;
51
76
this . stop ( false , e . target as Element | null ) ;
52
77
} ;
53
78
54
- private readonly onTouchEnd = ( e : TouchEvent ) => {
79
+ private readonly onTouchEnd = ( e : Event ) => {
55
80
e . preventDefault ( ) ;
81
+ e . stopPropagation ( ) ;
56
82
if ( ! this . state ) {
57
83
throw new Error ( notInitializedError ) ;
58
84
}
59
85
60
86
const position = this . state . lastPosition ?? this . state . startPosition ;
61
- const element = this . documentOrShadowRoot . elementFromPoint ( position . x , position . y ) ;
87
+ const element = this . dom . elementFromPoint ( position . x , position . y ) ;
62
88
this . stop ( false , element ) ;
63
89
} ;
64
90
65
- private readonly onTouchStart = ( e : TouchEvent ) => {
91
+ private readonly onTouchStart = ( e : Event ) => {
66
92
e . preventDefault ( ) ;
67
- if ( e . touches . length !== 1 ) {
93
+ e . stopPropagation ( ) ;
94
+ if ( ( e as TouchEvent ) . touches . length !== 1 ) {
68
95
this . stop ( true , null ) ;
69
96
}
70
97
} ;
@@ -92,11 +119,10 @@ export class BehaviorController {
92
119
throw new Error ( notInitializedError ) ;
93
120
}
94
121
95
- window . removeEventListener ( 'mousemove' , this . onMouseMove , false ) ;
96
- window . removeEventListener ( 'touchmove' , this . onTouchMove , nonPassiveOptions ) ;
97
- window . removeEventListener ( 'mouseup' , this . onMouseUp , false ) ;
98
- window . removeEventListener ( 'touchend' , this . onTouchEnd , nonPassiveOptions ) ;
99
- window . removeEventListener ( 'touchstart' , this . onTouchStart , nonPassiveOptions ) ;
122
+ if ( this . shadowRoot ) {
123
+ this . unbind ( this . shadowRoot ) ;
124
+ }
125
+ this . unbind ( window ) ;
100
126
101
127
this . state . behavior . onEnd ( interrupt , element ) ;
102
128
this . state = undefined ;
0 commit comments