@@ -600,6 +600,16 @@ export default () => ({
600
600
await nextFrame ( )
601
601
await this . $_computePosition ( )
602
602
await this . $_applyShowEffect ( )
603
+
604
+ // Scroll
605
+ if ( ! this . positioningDisabled ) {
606
+ this . $_registerEventListeners ( [
607
+ ...getScrollParents ( this . $_referenceNode ) ,
608
+ ...getScrollParents ( this . $_popperNode ) ,
609
+ ] , 'scroll' , ( ) => {
610
+ this . $_computePosition ( )
611
+ } )
612
+ }
603
613
} ,
604
614
605
615
async $_applyShowEffect ( ) {
@@ -682,6 +692,8 @@ export default () => ({
682
692
} , disposeTime )
683
693
}
684
694
695
+ this . $_removeEventListeners ( 'scroll' )
696
+
685
697
this . $emit ( 'apply-hide' )
686
698
687
699
// Advanced classes
@@ -723,30 +735,6 @@ export default () => ({
723
735
} ,
724
736
725
737
$_addEventListeners ( ) {
726
- const addListeners = ( targetNodes : any [ ] , eventType : string , handler : ( event : Event ) => void ) => {
727
- this . $_events . push ( { targetNodes, eventType, handler } )
728
- targetNodes . forEach ( node => node . addEventListener ( eventType , handler , supportsPassive
729
- ? {
730
- passive : true ,
731
- }
732
- : undefined ) )
733
- }
734
-
735
- const addEvents = ( targetNodes , eventMap , commonTriggers , customTrigger , handler ) => {
736
- let triggers = commonTriggers
737
-
738
- if ( customTrigger != null ) {
739
- triggers = typeof customTrigger === 'function' ? customTrigger ( triggers ) : customTrigger
740
- }
741
-
742
- triggers . forEach ( trigger => {
743
- const eventType = eventMap [ trigger ]
744
- if ( eventType ) {
745
- addListeners ( targetNodes , eventType , handler )
746
- }
747
- } )
748
- }
749
-
750
738
// Add trigger show events
751
739
752
740
const handleShow = event => {
@@ -758,8 +746,8 @@ export default () => ({
758
746
! this . $_preventShow && this . show ( { event } )
759
747
}
760
748
761
- addEvents ( this . $_targetNodes , SHOW_EVENT_MAP , this . triggers , this . showTriggers , handleShow )
762
- addEvents ( [ this . $_popperNode ] , SHOW_EVENT_MAP , this . popperTriggers , this . popperShowTriggers , handleShow )
749
+ this . $_registerTriggerListeners ( this . $_targetNodes , SHOW_EVENT_MAP , this . triggers , this . showTriggers , handleShow )
750
+ this . $_registerTriggerListeners ( [ this . $_popperNode ] , SHOW_EVENT_MAP , this . popperTriggers , this . popperShowTriggers , handleShow )
763
751
764
752
// Add trigger hide events
765
753
@@ -770,25 +758,45 @@ export default () => ({
770
758
this . hide ( { event } )
771
759
}
772
760
773
- addEvents ( this . $_targetNodes , HIDE_EVENT_MAP , this . triggers , this . hideTriggers , handleHide )
774
- addEvents ( [ this . $_popperNode ] , HIDE_EVENT_MAP , this . popperTriggers , this . popperHideTriggers , handleHide )
761
+ this . $_registerTriggerListeners ( this . $_targetNodes , HIDE_EVENT_MAP , this . triggers , this . hideTriggers , handleHide )
762
+ this . $_registerTriggerListeners ( [ this . $_popperNode ] , HIDE_EVENT_MAP , this . popperTriggers , this . popperHideTriggers , handleHide )
763
+ } ,
775
764
776
- // Scroll
777
- if ( ! this . positioningDisabled ) {
778
- addListeners ( [
779
- ...getScrollParents ( this . $_referenceNode ) ,
780
- ...getScrollParents ( this . $_popperNode ) ,
781
- ] , 'scroll' , ( ) => {
782
- this . $_computePosition ( )
783
- } )
765
+ $_registerEventListeners ( targetNodes : any [ ] , eventType : string , handler : ( event : Event ) => void ) {
766
+ this . $_events . push ( { targetNodes, eventType, handler } )
767
+ targetNodes . forEach ( node => node . addEventListener ( eventType , handler , supportsPassive
768
+ ? {
769
+ passive : true ,
770
+ }
771
+ : undefined ) )
772
+ } ,
773
+
774
+ $_registerTriggerListeners ( targetNodes : any [ ] , eventMap : Record < string , string > , commonTriggers , customTrigger , handler : ( event : Event ) => void ) {
775
+ let triggers = commonTriggers
776
+
777
+ if ( customTrigger != null ) {
778
+ triggers = typeof customTrigger === 'function' ? customTrigger ( triggers ) : customTrigger
784
779
}
780
+
781
+ triggers . forEach ( trigger => {
782
+ const eventType = eventMap [ trigger ]
783
+ if ( eventType ) {
784
+ this . $_registerEventListeners ( targetNodes , eventType , handler )
785
+ }
786
+ } )
785
787
} ,
786
788
787
- $_removeEventListeners ( ) {
788
- this . $_events . forEach ( ( { targetNodes, eventType, handler } ) => {
789
- targetNodes . forEach ( node => node . removeEventListener ( eventType , handler ) )
789
+ $_removeEventListeners ( filterEventType ?: string ) {
790
+ const newList = [ ]
791
+ this . $_events . forEach ( listener => {
792
+ const { targetNodes, eventType, handler } = listener
793
+ if ( ! filterEventType || filterEventType === eventType ) {
794
+ targetNodes . forEach ( node => node . removeEventListener ( eventType , handler ) )
795
+ } else {
796
+ newList . push ( listener )
797
+ }
790
798
} )
791
- this . $_events = [ ]
799
+ this . $_events = newList
792
800
} ,
793
801
794
802
$_refreshListeners ( ) {
0 commit comments