Skip to content

Commit f2199da

Browse files
committed
fix: don't compute position on scroll if hidden, closes #835
1 parent fcd9f0b commit f2199da

File tree

1 file changed

+48
-40
lines changed
  • packages/floating-vue/src/components

1 file changed

+48
-40
lines changed

packages/floating-vue/src/components/Popper.ts

+48-40
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,16 @@ export default () => ({
600600
await nextFrame()
601601
await this.$_computePosition()
602602
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+
}
603613
},
604614

605615
async $_applyShowEffect () {
@@ -682,6 +692,8 @@ export default () => ({
682692
}, disposeTime)
683693
}
684694

695+
this.$_removeEventListeners('scroll')
696+
685697
this.$emit('apply-hide')
686698

687699
// Advanced classes
@@ -723,30 +735,6 @@ export default () => ({
723735
},
724736

725737
$_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-
750738
// Add trigger show events
751739

752740
const handleShow = event => {
@@ -758,8 +746,8 @@ export default () => ({
758746
!this.$_preventShow && this.show({ event })
759747
}
760748

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)
763751

764752
// Add trigger hide events
765753

@@ -770,25 +758,45 @@ export default () => ({
770758
this.hide({ event })
771759
}
772760

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+
},
775764

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
784779
}
780+
781+
triggers.forEach(trigger => {
782+
const eventType = eventMap[trigger]
783+
if (eventType) {
784+
this.$_registerEventListeners(targetNodes, eventType, handler)
785+
}
786+
})
785787
},
786788

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+
}
790798
})
791-
this.$_events = []
799+
this.$_events = newList
792800
},
793801

794802
$_refreshListeners () {

0 commit comments

Comments
 (0)