Skip to content

Commit 1f4f945

Browse files
committed
fix(VSlider): skip position calculation if element does not exist
fixes #19891
1 parent 4ff8d58 commit 1f4f945

File tree

1 file changed

+22
-7
lines changed
  • packages/vuetify/src/components/VSlider

1 file changed

+22
-7
lines changed

packages/vuetify/src/components/VSlider/slider.ts

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type SliderProvide = {
3131
numTicks: Ref<number>
3232
onSliderMousedown: (e: MouseEvent) => void
3333
onSliderTouchstart: (e: TouchEvent) => void
34-
parseMouseMove: (e: MouseEvent | TouchEvent) => number
34+
parseMouseMove: (e: MouseEvent | TouchEvent) => number | void
3535
position: (val: number) => number
3636
readonly: Ref<boolean | null | undefined>
3737
rounded: Ref<boolean | number | string | undefined>
@@ -205,7 +205,11 @@ export const useSlider = ({
205205
const trackContainerRef = ref<VSliderTrack | undefined>()
206206
const activeThumbRef = ref<HTMLElement | undefined>()
207207

208-
function parseMouseMove (e: MouseEvent | TouchEvent): number {
208+
function parseMouseMove (e: MouseEvent | TouchEvent): number | void {
209+
const el: HTMLElement = trackContainerRef.value?.$el
210+
211+
if (!el) return
212+
209213
const vertical = props.direction === 'vertical'
210214
const start = vertical ? 'top' : 'left'
211215
const length = vertical ? 'height' : 'width'
@@ -214,7 +218,7 @@ export const useSlider = ({
214218
const {
215219
[start]: trackStart,
216220
[length]: trackLength,
217-
} = trackContainerRef.value?.$el.getBoundingClientRect()
221+
} = el.getBoundingClientRect()
218222
const clickOffset = getPosition(e, position)
219223

220224
// It is possible for left to be NaN, force to number
@@ -226,13 +230,17 @@ export const useSlider = ({
226230
}
227231

228232
const handleStop = (e: MouseEvent | TouchEvent) => {
229-
onSliderEnd({ value: parseMouseMove(e) })
233+
const value = parseMouseMove(e)
234+
if (value != null) {
235+
onSliderEnd({ value })
236+
}
230237

231238
mousePressed.value = false
232239
startOffset.value = 0
233240
}
234241

235242
const handleStart = (e: MouseEvent | TouchEvent) => {
243+
const value = parseMouseMove(e)
236244
activeThumbRef.value = getActiveThumb(e)
237245

238246
if (!activeThumbRef.value) return
@@ -243,17 +251,24 @@ export const useSlider = ({
243251
startOffset.value = getOffset(e, activeThumbRef.value, props.direction)
244252
} else {
245253
startOffset.value = 0
246-
onSliderMove({ value: parseMouseMove(e) })
254+
if (value != null) {
255+
onSliderMove({ value })
256+
}
247257
}
248258

249-
onSliderStart({ value: parseMouseMove(e) })
259+
if (value != null) {
260+
onSliderStart({ value })
261+
}
250262
nextTick(() => activeThumbRef.value?.focus())
251263
}
252264

253265
const moveListenerOptions = { passive: true, capture: true }
254266

255267
function onMouseMove (e: MouseEvent | TouchEvent) {
256-
onSliderMove({ value: parseMouseMove(e) })
268+
const value = parseMouseMove(e)
269+
if (value != null) {
270+
onSliderMove({ value })
271+
}
257272
}
258273

259274
function onSliderMouseUp (e: MouseEvent) {

0 commit comments

Comments
 (0)