From 69b3ff0df9a3208d97feca0590d7e2289c685aca Mon Sep 17 00:00:00 2001 From: Ernest Date: Thu, 20 May 2021 00:41:47 +0800 Subject: [PATCH] fix: prevent infinite loop Closes #168 --- src/hooks.ts | 6 ++++-- src/index.vue | 8 ++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/hooks.ts b/src/hooks.ts index 15f86d41..c059b0d5 100644 --- a/src/hooks.ts +++ b/src/hooks.ts @@ -25,7 +25,8 @@ export const usePointer = (options: Ref, highlightedOriginalIndex: Ref if (isSomeSelectable.value === false) return if (highlightedOriginalIndex.value === null) return let tempOriginalIndex = highlightedOriginalIndex.value + 1 - while (tempOriginalIndex !== highlightedOriginalIndex.value) { + let safeCount = 0 + while (tempOriginalIndex !== highlightedOriginalIndex.value && safeCount++ < options.value.length) { if (options.value.length <= tempOriginalIndex) tempOriginalIndex = 0 if (pointerSet(tempOriginalIndex)) break ++tempOriginalIndex @@ -35,7 +36,8 @@ export const usePointer = (options: Ref, highlightedOriginalIndex: Ref if (isSomeSelectable.value === false) return if (highlightedOriginalIndex.value === null) return let tempOriginalIndex = highlightedOriginalIndex.value - 1 - while (tempOriginalIndex !== highlightedOriginalIndex.value) { + let safeCount = 0 + while (tempOriginalIndex !== highlightedOriginalIndex.value && safeCount++ < options.value.length) { if (tempOriginalIndex < 0) tempOriginalIndex = options.value.length - 1 if (pointerSet(tempOriginalIndex)) break --tempOriginalIndex diff --git a/src/index.vue b/src/index.vue index 286a89ba..0630d9cc 100644 --- a/src/index.vue +++ b/src/index.vue @@ -556,12 +556,15 @@ const VueSelect = { if (!dropdown.value) return const computedStyle = getComputedStyle(highlightedEl) + let safeCount + safeCount = 0 while ( highlightedEl.offsetTop + parseFloat(computedStyle.height) + parseFloat(computedStyle.paddingTop) + parseFloat(computedStyle.paddingBottom) > - dropdown.value.$el.clientHeight + dropdown.value.$el.scrollTop + dropdown.value.$el.clientHeight + dropdown.value.$el.scrollTop && + safeCount++ < optionsWithInfo.value.length ) { dropdown.value.$el.scrollTop = dropdown.value.$el.scrollTop + @@ -569,7 +572,8 @@ const VueSelect = { parseFloat(computedStyle.paddingTop) + parseFloat(computedStyle.paddingBottom) } - while (highlightedEl.offsetTop < dropdown.value.$el.scrollTop) { + safeCount = 0 + while (highlightedEl.offsetTop < dropdown.value.$el.scrollTop && safeCount++ < optionsWithInfo.value.length) { dropdown.value.$el.scrollTop = dropdown.value.$el.scrollTop - parseFloat(computedStyle.height) -