From f23c3816f6a66a3d80244d20cadb5c5f4b60ec48 Mon Sep 17 00:00:00 2001 From: zhengjihao <2714499297@qq.com> Date: Wed, 16 Jul 2025 19:11:14 +0800 Subject: [PATCH 01/11] fix: enhance useScrollDrag with unified drag state cleanup --- src/hooks/useScrollDrag.ts | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/hooks/useScrollDrag.ts b/src/hooks/useScrollDrag.ts index 36dfaab..676ee14 100644 --- a/src/hooks/useScrollDrag.ts +++ b/src/hooks/useScrollDrag.ts @@ -38,6 +38,12 @@ export default function useScrollDrag( }); }; + // 清理拖拽状态的统一函数 + const clearDragState = () => { + mouseDownLock = false; + stopScroll(); + }; + const onMouseDown = (e: MouseEvent) => { // Skip if element set draggable if ((e.target as HTMLElement).draggable || e.button !== 0) { @@ -52,10 +58,28 @@ export default function useScrollDrag( mouseDownLock = true; } }; + const onMouseUp = () => { - mouseDownLock = false; - stopScroll(); + clearDragState(); }; + + // 当开始原生拖拽时清理状态 + const onDragStart = () => { + clearDragState(); + }; + + // 当失去焦点时清理状态 + const onBlur = () => { + clearDragState(); + }; + + // 当页面不可见时清理状态 + const onVisibilityChange = () => { + if (document.hidden) { + clearDragState(); + } + }; + const onMouseMove = (e: MouseEvent) => { if (mouseDownLock) { const mouseY = getPageXY(e, false); @@ -78,11 +102,21 @@ export default function useScrollDrag( ele.addEventListener('mousedown', onMouseDown); ele.ownerDocument.addEventListener('mouseup', onMouseUp); ele.ownerDocument.addEventListener('mousemove', onMouseMove); + + // 添加额外的状态清理事件监听器 + ele.ownerDocument.addEventListener('dragstart', onDragStart); + ele.ownerDocument.addEventListener('dragend', clearDragState); + window.addEventListener('blur', onBlur); + document.addEventListener('visibilitychange', onVisibilityChange); return () => { ele.removeEventListener('mousedown', onMouseDown); ele.ownerDocument.removeEventListener('mouseup', onMouseUp); ele.ownerDocument.removeEventListener('mousemove', onMouseMove); + ele.ownerDocument.removeEventListener('dragstart', onDragStart); + ele.ownerDocument.removeEventListener('dragend', clearDragState); + window.removeEventListener('blur', onBlur); + document.removeEventListener('visibilitychange', onVisibilityChange); stopScroll(); }; } From 2aa59f565302bcf5c958aefef0316d1208694988 Mon Sep 17 00:00:00 2001 From: zhengjihao <2714499297@qq.com> Date: Wed, 16 Jul 2025 20:42:48 +0800 Subject: [PATCH 02/11] 3.19.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dc79dbf..4c0bc60 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rc-virtual-list", - "version": "3.19.1", + "version": "3.19.2", "description": "React Virtual List Component", "engines": { "node": ">=8.x" From 0ce568cf0ec3cc4c01cf0468da0dcf742d2eaae2 Mon Sep 17 00:00:00 2001 From: zhengjihao <2714499297@qq.com> Date: Wed, 16 Jul 2025 21:02:08 +0800 Subject: [PATCH 03/11] fix: revert version to 3.19.1 in package.json The package version was changed from 3.19.2 to 3.19.1, possibly to correct a versioning error or revert a previous update. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4c0bc60..dc79dbf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rc-virtual-list", - "version": "3.19.2", + "version": "3.19.1", "description": "React Virtual List Component", "engines": { "node": ">=8.x" From bae7ddc8bfb3625d4e9121c6b5e3c008c5339fb6 Mon Sep 17 00:00:00 2001 From: zhengjihao <2714499297@qq.com> Date: Thu, 17 Jul 2025 11:03:57 +0800 Subject: [PATCH 04/11] test: add test to prevent scroll after text drop Introduces a test to verify that the list does not scroll when table text is dragged and dropped, ensuring onScroll is not triggered during drag-and-drop interactions. --- tests/scroll.test.js | 66 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/tests/scroll.test.js b/tests/scroll.test.js index e3a7e04..ad1bdd9 100644 --- a/tests/scroll.test.js +++ b/tests/scroll.test.js @@ -731,4 +731,70 @@ describe('List.Scroll', () => { jest.useRealTimers(); }); + + it('should not scroll after drop table text', () => { + + const onScroll = jest.fn(); + const { container } = render( + + {({ id }) =>
  • {id}
  • } +
    , + ); + // 选中第99个 fixed-item 的文本内容 + const fixedItems = container.querySelectorAll('.fixed-item'); + const targetItem = fixedItems[99]; + if (targetItem) { + const range = document.createRange(); + range.selectNodeContents(targetItem); + const selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + } + // 模拟将选中的文本拖拽到列表最底部 + const listHolder = container.querySelector('.rc-virtual-list-holder'); + if (targetItem && listHolder) { + // 创建拖拽事件 + const dragStartEvent = new DragEvent('dragstart', { bubbles: true }); + targetItem.dispatchEvent(dragStartEvent); + + // 拖拽到最底部 + const rect = listHolder.getBoundingClientRect(); + const dragOverEvent = new DragEvent('dragover', { + bubbles: true, + clientY: rect.bottom + 10, + }); + listHolder.dispatchEvent(dragOverEvent); + + // 松开鼠标 + const dropEvent = new DragEvent('drop', { + bubbles: true, + clientY: rect.bottom + 10, + }); + listHolder.dispatchEvent(dropEvent); + + const dragEndEvent = new DragEvent('dragend', { bubbles: true }); + targetItem.dispatchEvent(dragEndEvent); + } + // 检查 onScroll 没有被触发 + expect(onScroll).not.toHaveBeenCalled(); + + // 模拟将鼠标移动到列表最顶部 + if (listHolder) { + const rect = listHolder.getBoundingClientRect(); + const mouseMoveEvent = new MouseEvent('mousemove', { + bubbles: true, + clientY: rect.top - 10, + }); + listHolder.dispatchEvent(mouseMoveEvent); + } + // 检查 onScroll 没有被触发 + expect(onScroll).not.toHaveBeenCalled(); + }); }); From 2a1f1b06848df7d830daa96ff7bb150d4e41f371 Mon Sep 17 00:00:00 2001 From: zhengjihao <2714499297@qq.com> Date: Thu, 17 Jul 2025 11:11:12 +0800 Subject: [PATCH 05/11] chore: translate comments in scroll test to English --- tests/scroll.test.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/scroll.test.js b/tests/scroll.test.js index ad1bdd9..1cc0ffe 100644 --- a/tests/scroll.test.js +++ b/tests/scroll.test.js @@ -747,7 +747,7 @@ describe('List.Scroll', () => { {({ id }) =>
  • {id}
  • } , ); - // 选中第99个 fixed-item 的文本内容 + // Select the text content of the 99th fixed-item const fixedItems = container.querySelectorAll('.fixed-item'); const targetItem = fixedItems[99]; if (targetItem) { @@ -757,14 +757,14 @@ describe('List.Scroll', () => { selection.removeAllRanges(); selection.addRange(range); } - // 模拟将选中的文本拖拽到列表最底部 + // Simulate dragging the selected text to the bottom of the list const listHolder = container.querySelector('.rc-virtual-list-holder'); if (targetItem && listHolder) { - // 创建拖拽事件 + // Create drag event const dragStartEvent = new DragEvent('dragstart', { bubbles: true }); targetItem.dispatchEvent(dragStartEvent); - // 拖拽到最底部 + // Drag to the bottom const rect = listHolder.getBoundingClientRect(); const dragOverEvent = new DragEvent('dragover', { bubbles: true, @@ -772,7 +772,7 @@ describe('List.Scroll', () => { }); listHolder.dispatchEvent(dragOverEvent); - // 松开鼠标 + // Release mouse const dropEvent = new DragEvent('drop', { bubbles: true, clientY: rect.bottom + 10, @@ -782,10 +782,10 @@ describe('List.Scroll', () => { const dragEndEvent = new DragEvent('dragend', { bubbles: true }); targetItem.dispatchEvent(dragEndEvent); } - // 检查 onScroll 没有被触发 + // Check that onScroll was not triggered expect(onScroll).not.toHaveBeenCalled(); - // 模拟将鼠标移动到列表最顶部 + // Simulate moving the mouse to the top of the list if (listHolder) { const rect = listHolder.getBoundingClientRect(); const mouseMoveEvent = new MouseEvent('mousemove', { @@ -794,7 +794,7 @@ describe('List.Scroll', () => { }); listHolder.dispatchEvent(mouseMoveEvent); } - // 检查 onScroll 没有被触发 + // Check that onScroll was not triggered expect(onScroll).not.toHaveBeenCalled(); }); }); From 24b7327be9ef1f33566a4a80df2f453535e7a5b4 Mon Sep 17 00:00:00 2001 From: zhengjihao <2714499297@qq.com> Date: Thu, 17 Jul 2025 11:41:48 +0800 Subject: [PATCH 06/11] fix: remove blur and visibilitychange cleanup in useScrollDrag --- src/hooks/useScrollDrag.ts | 19 +------------ tests/scroll.test.js | 55 ++++++++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/src/hooks/useScrollDrag.ts b/src/hooks/useScrollDrag.ts index 676ee14..bc4fe94 100644 --- a/src/hooks/useScrollDrag.ts +++ b/src/hooks/useScrollDrag.ts @@ -62,24 +62,11 @@ export default function useScrollDrag( const onMouseUp = () => { clearDragState(); }; - - // 当开始原生拖拽时清理状态 + const onDragStart = () => { clearDragState(); }; - // 当失去焦点时清理状态 - const onBlur = () => { - clearDragState(); - }; - - // 当页面不可见时清理状态 - const onVisibilityChange = () => { - if (document.hidden) { - clearDragState(); - } - }; - const onMouseMove = (e: MouseEvent) => { if (mouseDownLock) { const mouseY = getPageXY(e, false); @@ -106,8 +93,6 @@ export default function useScrollDrag( // 添加额外的状态清理事件监听器 ele.ownerDocument.addEventListener('dragstart', onDragStart); ele.ownerDocument.addEventListener('dragend', clearDragState); - window.addEventListener('blur', onBlur); - document.addEventListener('visibilitychange', onVisibilityChange); return () => { ele.removeEventListener('mousedown', onMouseDown); @@ -115,8 +100,6 @@ export default function useScrollDrag( ele.ownerDocument.removeEventListener('mousemove', onMouseMove); ele.ownerDocument.removeEventListener('dragstart', onDragStart); ele.ownerDocument.removeEventListener('dragend', clearDragState); - window.removeEventListener('blur', onBlur); - document.removeEventListener('visibilitychange', onVisibilityChange); stopScroll(); }; } diff --git a/tests/scroll.test.js b/tests/scroll.test.js index 1cc0ffe..48d03e7 100644 --- a/tests/scroll.test.js +++ b/tests/scroll.test.js @@ -735,6 +735,12 @@ describe('List.Scroll', () => { it('should not scroll after drop table text', () => { const onScroll = jest.fn(); + // 这两个事件绑定在 document + const onDragStart = jest.fn(); + const onDragEnd = jest.fn(); + document.addEventListener('dragstart', onDragStart); + document.addEventListener('dragend', onDragEnd); + const { container } = render( { data={genData(200)} onScroll={onScroll} > - {({ id }) =>
  • {id}
  • } + {({ id }) =>
  • {id}
  • }
    , ); - // Select the text content of the 99th fixed-item + // 选择第一个可见的 fixed-item 的文本内容 const fixedItems = container.querySelectorAll('.fixed-item'); - const targetItem = fixedItems[99]; + const targetItem = fixedItems[0]; // 使用第一个可见元素 if (targetItem) { const range = document.createRange(); range.selectNodeContents(targetItem); @@ -757,35 +763,40 @@ describe('List.Scroll', () => { selection.removeAllRanges(); selection.addRange(range); } - // Simulate dragging the selected text to the bottom of the list + // 选中 fixed-item 里的文本并拖拽文本到列表底部 const listHolder = container.querySelector('.rc-virtual-list-holder'); if (targetItem && listHolder) { - // Create drag event - const dragStartEvent = new DragEvent('dragstart', { bubbles: true }); - targetItem.dispatchEvent(dragStartEvent); + // 创建选区,选中 fixed-item 的文本 + const range = document.createRange(); + range.selectNodeContents(targetItem); + const selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); - // Drag to the bottom + // 模拟拖拽文本 + fireEvent.dragStart(targetItem, { bubbles: true }); + + // 拖拽到列表底部 const rect = listHolder.getBoundingClientRect(); - const dragOverEvent = new DragEvent('dragover', { - bubbles: true, + fireEvent.dragOver(listHolder, { clientY: rect.bottom + 10, + bubbles: true, }); - listHolder.dispatchEvent(dragOverEvent); - // Release mouse - const dropEvent = new DragEvent('drop', { - bubbles: true, + // 松开鼠标 + fireEvent.drop(listHolder, { clientY: rect.bottom + 10, + bubbles: true, }); - listHolder.dispatchEvent(dropEvent); - const dragEndEvent = new DragEvent('dragend', { bubbles: true }); - targetItem.dispatchEvent(dragEndEvent); + fireEvent.dragEnd(targetItem, { bubbles: true }); } - // Check that onScroll was not triggered + // 检查 onScroll 没有被触发 expect(onScroll).not.toHaveBeenCalled(); + expect(onDragStart).toHaveBeenCalled(); + expect(onDragEnd).toHaveBeenCalled(); - // Simulate moving the mouse to the top of the list + // 模拟鼠标移动到列表顶部 if (listHolder) { const rect = listHolder.getBoundingClientRect(); const mouseMoveEvent = new MouseEvent('mousemove', { @@ -794,7 +805,11 @@ describe('List.Scroll', () => { }); listHolder.dispatchEvent(mouseMoveEvent); } - // Check that onScroll was not triggered + // 检查 onScroll 没有被触发 expect(onScroll).not.toHaveBeenCalled(); + + // 清理事件监听器 + document.removeEventListener('dragstart', onDragStart); + document.removeEventListener('dragend', onDragEnd); }); }); From 1fcd09dba7e27e5004ec5522e85dcc626a227632 Mon Sep 17 00:00:00 2001 From: zhengjihao <2714499297@qq.com> Date: Thu, 17 Jul 2025 11:42:30 +0800 Subject: [PATCH 07/11] chore: remote comment --- src/hooks/useScrollDrag.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hooks/useScrollDrag.ts b/src/hooks/useScrollDrag.ts index bc4fe94..22b14aa 100644 --- a/src/hooks/useScrollDrag.ts +++ b/src/hooks/useScrollDrag.ts @@ -90,7 +90,6 @@ export default function useScrollDrag( ele.ownerDocument.addEventListener('mouseup', onMouseUp); ele.ownerDocument.addEventListener('mousemove', onMouseMove); - // 添加额外的状态清理事件监听器 ele.ownerDocument.addEventListener('dragstart', onDragStart); ele.ownerDocument.addEventListener('dragend', clearDragState); From dc9f00e14d8a04978ae1199101a02cc96e56f551 Mon Sep 17 00:00:00 2001 From: zhengjihao <2714499297@qq.com> Date: Tue, 19 Aug 2025 21:29:57 +0800 Subject: [PATCH 08/11] chore: remove comments from scroll drag code and tests --- src/hooks/useScrollDrag.ts | 1 - tests/scroll.test.js | 13 +------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/hooks/useScrollDrag.ts b/src/hooks/useScrollDrag.ts index 22b14aa..fde7a4a 100644 --- a/src/hooks/useScrollDrag.ts +++ b/src/hooks/useScrollDrag.ts @@ -38,7 +38,6 @@ export default function useScrollDrag( }); }; - // 清理拖拽状态的统一函数 const clearDragState = () => { mouseDownLock = false; stopScroll(); diff --git a/tests/scroll.test.js b/tests/scroll.test.js index 48d03e7..2ed49f0 100644 --- a/tests/scroll.test.js +++ b/tests/scroll.test.js @@ -735,7 +735,6 @@ describe('List.Scroll', () => { it('should not scroll after drop table text', () => { const onScroll = jest.fn(); - // 这两个事件绑定在 document const onDragStart = jest.fn(); const onDragEnd = jest.fn(); document.addEventListener('dragstart', onDragStart); @@ -753,9 +752,8 @@ describe('List.Scroll', () => { {({ id }) =>
  • {id}
  • } , ); - // 选择第一个可见的 fixed-item 的文本内容 const fixedItems = container.querySelectorAll('.fixed-item'); - const targetItem = fixedItems[0]; // 使用第一个可见元素 + const targetItem = fixedItems[0]; if (targetItem) { const range = document.createRange(); range.selectNodeContents(targetItem); @@ -763,27 +761,22 @@ describe('List.Scroll', () => { selection.removeAllRanges(); selection.addRange(range); } - // 选中 fixed-item 里的文本并拖拽文本到列表底部 const listHolder = container.querySelector('.rc-virtual-list-holder'); if (targetItem && listHolder) { - // 创建选区,选中 fixed-item 的文本 const range = document.createRange(); range.selectNodeContents(targetItem); const selection = window.getSelection(); selection.removeAllRanges(); selection.addRange(range); - // 模拟拖拽文本 fireEvent.dragStart(targetItem, { bubbles: true }); - // 拖拽到列表底部 const rect = listHolder.getBoundingClientRect(); fireEvent.dragOver(listHolder, { clientY: rect.bottom + 10, bubbles: true, }); - // 松开鼠标 fireEvent.drop(listHolder, { clientY: rect.bottom + 10, bubbles: true, @@ -791,12 +784,10 @@ describe('List.Scroll', () => { fireEvent.dragEnd(targetItem, { bubbles: true }); } - // 检查 onScroll 没有被触发 expect(onScroll).not.toHaveBeenCalled(); expect(onDragStart).toHaveBeenCalled(); expect(onDragEnd).toHaveBeenCalled(); - // 模拟鼠标移动到列表顶部 if (listHolder) { const rect = listHolder.getBoundingClientRect(); const mouseMoveEvent = new MouseEvent('mousemove', { @@ -805,10 +796,8 @@ describe('List.Scroll', () => { }); listHolder.dispatchEvent(mouseMoveEvent); } - // 检查 onScroll 没有被触发 expect(onScroll).not.toHaveBeenCalled(); - // 清理事件监听器 document.removeEventListener('dragstart', onDragStart); document.removeEventListener('dragend', onDragEnd); }); From a820beb90cf8d11b96dd4529bd4ada74bf10d5dc Mon Sep 17 00:00:00 2001 From: zhengjihao <2714499297@qq.com> Date: Tue, 19 Aug 2025 21:40:34 +0800 Subject: [PATCH 09/11] fix: refactor scroll drag event handling and test helper --- src/hooks/useScrollDrag.ts | 17 ++--------------- tests/scroll.test.js | 21 +++++++++++---------- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/src/hooks/useScrollDrag.ts b/src/hooks/useScrollDrag.ts index fde7a4a..31928c4 100644 --- a/src/hooks/useScrollDrag.ts +++ b/src/hooks/useScrollDrag.ts @@ -58,14 +58,6 @@ export default function useScrollDrag( } }; - const onMouseUp = () => { - clearDragState(); - }; - - const onDragStart = () => { - clearDragState(); - }; - const onMouseMove = (e: MouseEvent) => { if (mouseDownLock) { const mouseY = getPageXY(e, false); @@ -86,18 +78,13 @@ export default function useScrollDrag( }; ele.addEventListener('mousedown', onMouseDown); - ele.ownerDocument.addEventListener('mouseup', onMouseUp); + ele.ownerDocument.addEventListener('mouseup', clearDragState); ele.ownerDocument.addEventListener('mousemove', onMouseMove); - - ele.ownerDocument.addEventListener('dragstart', onDragStart); - ele.ownerDocument.addEventListener('dragend', clearDragState); return () => { ele.removeEventListener('mousedown', onMouseDown); - ele.ownerDocument.removeEventListener('mouseup', onMouseUp); + ele.ownerDocument.removeEventListener('mouseup', clearDragState); ele.ownerDocument.removeEventListener('mousemove', onMouseMove); - ele.ownerDocument.removeEventListener('dragstart', onDragStart); - ele.ownerDocument.removeEventListener('dragend', clearDragState); stopScroll(); }; } diff --git a/tests/scroll.test.js b/tests/scroll.test.js index 2ed49f0..6962f79 100644 --- a/tests/scroll.test.js +++ b/tests/scroll.test.js @@ -734,6 +734,15 @@ describe('List.Scroll', () => { it('should not scroll after drop table text', () => { + // Helper function to select text content of an element + const selectElementText = (element) => { + const range = document.createRange(); + range.selectNodeContents(element); + const selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + }; + const onScroll = jest.fn(); const onDragStart = jest.fn(); const onDragEnd = jest.fn(); @@ -755,19 +764,11 @@ describe('List.Scroll', () => { const fixedItems = container.querySelectorAll('.fixed-item'); const targetItem = fixedItems[0]; if (targetItem) { - const range = document.createRange(); - range.selectNodeContents(targetItem); - const selection = window.getSelection(); - selection.removeAllRanges(); - selection.addRange(range); + selectElementText(targetItem); } const listHolder = container.querySelector('.rc-virtual-list-holder'); if (targetItem && listHolder) { - const range = document.createRange(); - range.selectNodeContents(targetItem); - const selection = window.getSelection(); - selection.removeAllRanges(); - selection.addRange(range); + selectElementText(targetItem); fireEvent.dragStart(targetItem, { bubbles: true }); From b77332d4b14de6281e05d08e29b8230905cebffd Mon Sep 17 00:00:00 2001 From: zhengjihao <2714499297@qq.com> Date: Tue, 19 Aug 2025 22:17:16 +0800 Subject: [PATCH 10/11] fix: handle drag events in useScrollDrag hook --- src/hooks/useScrollDrag.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/hooks/useScrollDrag.ts b/src/hooks/useScrollDrag.ts index 31928c4..3dedcce 100644 --- a/src/hooks/useScrollDrag.ts +++ b/src/hooks/useScrollDrag.ts @@ -80,11 +80,16 @@ export default function useScrollDrag( ele.addEventListener('mousedown', onMouseDown); ele.ownerDocument.addEventListener('mouseup', clearDragState); ele.ownerDocument.addEventListener('mousemove', onMouseMove); + + ele.ownerDocument.addEventListener('dragstart', clearDragState); + ele.ownerDocument.addEventListener('dragend', clearDragState); return () => { ele.removeEventListener('mousedown', onMouseDown); ele.ownerDocument.removeEventListener('mouseup', clearDragState); ele.ownerDocument.removeEventListener('mousemove', onMouseMove); + ele.ownerDocument.removeEventListener('dragstart', clearDragState); + ele.ownerDocument.removeEventListener('dragend', clearDragState); stopScroll(); }; } From 294ab972a7306d0b95f3c0aa4e7c7b629a1c81ac Mon Sep 17 00:00:00 2001 From: zhengjihao <2714499297@qq.com> Date: Thu, 21 Aug 2025 17:24:08 +0800 Subject: [PATCH 11/11] chore: refactor scroll test for drag-and-drop behavior --- tests/scroll.test.js | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/tests/scroll.test.js b/tests/scroll.test.js index 6962f79..2e30f46 100644 --- a/tests/scroll.test.js +++ b/tests/scroll.test.js @@ -732,9 +732,7 @@ describe('List.Scroll', () => { jest.useRealTimers(); }); - it('should not scroll after drop table text', () => { - - // Helper function to select text content of an element + it('should not scroll after dropping selected list text', () => { const selectElementText = (element) => { const range = document.createRange(); range.selectNodeContents(element); @@ -769,8 +767,13 @@ describe('List.Scroll', () => { const listHolder = container.querySelector('.rc-virtual-list-holder'); if (targetItem && listHolder) { selectElementText(targetItem); + + fireEvent.scroll(listHolder, { target: { scrollTop: 100 } }); + expect(onScroll).toHaveBeenCalled(); + const scrollCallCountBeforeDrop = onScroll.mock.calls.length; - fireEvent.dragStart(targetItem, { bubbles: true }); + const dragStartEvent = new Event('dragstart', { bubbles: true, cancelable: true }); + targetItem.ownerDocument.dispatchEvent(dragStartEvent); const rect = listHolder.getBoundingClientRect(); fireEvent.dragOver(listHolder, { @@ -783,21 +786,25 @@ describe('List.Scroll', () => { bubbles: true, }); - fireEvent.dragEnd(targetItem, { bubbles: true }); - } - expect(onScroll).not.toHaveBeenCalled(); - expect(onDragStart).toHaveBeenCalled(); - expect(onDragEnd).toHaveBeenCalled(); + const dragEndEvent = new Event('dragend', { bubbles: true, cancelable: true }); + targetItem.ownerDocument.dispatchEvent(dragEndEvent); - if (listHolder) { - const rect = listHolder.getBoundingClientRect(); + const afterRect = listHolder.getBoundingClientRect(); const mouseMoveEvent = new MouseEvent('mousemove', { bubbles: true, - clientY: rect.top - 10, + clientY: afterRect.top - 10, }); listHolder.dispatchEvent(mouseMoveEvent); + act(() => { + jest.advanceTimersByTime(100); + }); + expect(onScroll.mock.calls.length).toBe(scrollCallCountBeforeDrop); } - expect(onScroll).not.toHaveBeenCalled(); + expect(onDragStart).toHaveBeenCalled(); + expect(onDragEnd).toHaveBeenCalled(); + + const sel = window.getSelection(); + sel && sel.removeAllRanges(); document.removeEventListener('dragstart', onDragStart); document.removeEventListener('dragend', onDragEnd);