@@ -14,7 +14,7 @@ import { placements, Placement } from '../util/popper'
14
14
import { SHOW_EVENT_MAP , HIDE_EVENT_MAP } from '../util/events'
15
15
import { removeFromArray } from '../util/lang'
16
16
import { nextFrame } from '../util/frame'
17
- import { getDefaultConfig , getAllParentThemes } from '../config'
17
+ import { getDefaultConfig , getAllParentThemes , config } from '../config'
18
18
19
19
export type ComputePositionConfig = Parameters < typeof computePosition > [ 2 ]
20
20
@@ -320,6 +320,7 @@ const createPopper = () => defineComponent({
320
320
pendingHide : false ,
321
321
containsGlobalTarget : false ,
322
322
isDisposed : true ,
323
+ mouseDownContains : false ,
323
324
}
324
325
} ,
325
326
@@ -1047,25 +1048,50 @@ const createPopper = () => defineComponent({
1047
1048
1048
1049
if ( typeof document !== 'undefined' && typeof window !== 'undefined' ) {
1049
1050
if ( isIOS ) {
1050
- document . addEventListener ( 'touchstart' , handleGlobalClose , supportsPassive
1051
+ const options = supportsPassive
1051
1052
? {
1052
1053
passive : true ,
1053
1054
capture : true ,
1054
1055
}
1055
- : true )
1056
+ : true
1057
+ document . addEventListener ( 'touchstart' , ( event ) => handleGlobalPointerDown ( event , true ) , options )
1058
+ document . addEventListener ( 'touchend' , ( event ) => handleGlobalPointerUp ( event , true ) , options )
1056
1059
} else {
1057
- window . addEventListener ( 'mousedown' , handleGlobalClose , true )
1060
+ window . addEventListener ( 'mousedown' , ( event ) => handleGlobalPointerDown ( event , false ) , true )
1061
+ window . addEventListener ( 'click' , ( event ) => handleGlobalPointerUp ( event , false ) , true )
1058
1062
}
1059
1063
window . addEventListener ( 'resize' , recomputeAllPoppers )
1060
1064
}
1061
1065
1062
- function handleGlobalClose ( event : PopperEvent , touch = false ) {
1066
+ function handleGlobalPointerDown ( event : PopperEvent , touch : boolean ) {
1067
+ if ( config . autoHideOnMousedown ) {
1068
+ handleGlobalClose ( event , touch )
1069
+ } else {
1070
+ // Compute contains only
1071
+ for ( let i = 0 ; i < shownPoppers . length ; i ++ ) {
1072
+ const popper = shownPoppers [ i ]
1073
+ try {
1074
+ popper . mouseDownContains = popper . popperNode ( ) . contains ( event . target )
1075
+ } catch ( e ) {
1076
+ // noop
1077
+ }
1078
+ }
1079
+ }
1080
+ }
1081
+
1082
+ function handleGlobalPointerUp ( event : PopperEvent , touch : boolean ) {
1083
+ if ( ! config . autoHideOnMousedown ) {
1084
+ handleGlobalClose ( event , touch )
1085
+ }
1086
+ }
1087
+
1088
+ function handleGlobalClose ( event : PopperEvent , touch : boolean ) {
1063
1089
const preventClose : Record < string , true > = { }
1064
1090
1065
1091
for ( let i = shownPoppers . length - 1 ; i >= 0 ; i -- ) {
1066
1092
const popper = shownPoppers [ i ]
1067
1093
try {
1068
- const contains = popper . containsGlobalTarget = popper . popperNode ( ) . contains ( event . target )
1094
+ const contains = popper . containsGlobalTarget = popper . mouseDownContains || popper . popperNode ( ) . contains ( event . target )
1069
1095
popper . pendingHide = false
1070
1096
1071
1097
// Delay so that close directive has time to set values (closeAllPopover, closePopover)
0 commit comments