@@ -15,7 +15,14 @@ export class BehaviorController {
1515 lastPosition ?: Vector ;
1616 } ;
1717
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+ ) { }
1926
2027 public start ( startPosition : Vector , behavior : Behavior ) {
2128 if ( this . state ) {
@@ -29,42 +36,62 @@ export class BehaviorController {
2936 } ;
3037 behavior . onStart ( this . state . startPosition ) ;
3138
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 ) ;
3759 }
3860
39- private readonly onMouseMove = ( e : MouseEvent ) => {
61+ private readonly onMouseMove = ( e : Event ) => {
4062 e . preventDefault ( ) ;
41- this . move ( readMousePosition ( e ) ) ;
63+ e . stopPropagation ( ) ;
64+ this . move ( readMousePosition ( e as MouseEvent ) ) ;
4265 } ;
4366
44- private readonly onTouchMove = ( e : TouchEvent ) => {
67+ private readonly onTouchMove = ( e : Event ) => {
4568 e . preventDefault ( ) ;
46- this . move ( readTouchPosition ( e ) ) ;
69+ e . stopPropagation ( ) ;
70+ this . move ( readTouchPosition ( e as TouchEvent ) ) ;
4771 } ;
4872
49- private readonly onMouseUp = ( e : MouseEvent ) => {
73+ private readonly onMouseUp = ( e : Event ) => {
5074 e . preventDefault ( ) ;
75+ e . stopPropagation ( ) ;
5176 this . stop ( false , e . target as Element | null ) ;
5277 } ;
5378
54- private readonly onTouchEnd = ( e : TouchEvent ) => {
79+ private readonly onTouchEnd = ( e : Event ) => {
5580 e . preventDefault ( ) ;
81+ e . stopPropagation ( ) ;
5682 if ( ! this . state ) {
5783 throw new Error ( notInitializedError ) ;
5884 }
5985
6086 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 ) ;
6288 this . stop ( false , element ) ;
6389 } ;
6490
65- private readonly onTouchStart = ( e : TouchEvent ) => {
91+ private readonly onTouchStart = ( e : Event ) => {
6692 e . preventDefault ( ) ;
67- if ( e . touches . length !== 1 ) {
93+ e . stopPropagation ( ) ;
94+ if ( ( e as TouchEvent ) . touches . length !== 1 ) {
6895 this . stop ( true , null ) ;
6996 }
7097 } ;
@@ -92,11 +119,10 @@ export class BehaviorController {
92119 throw new Error ( notInitializedError ) ;
93120 }
94121
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 ) ;
100126
101127 this . state . behavior . onEnd ( interrupt , element ) ;
102128 this . state = undefined ;
0 commit comments