From 2e95244176f9f32ce8069cbce1599d39a1c1c922 Mon Sep 17 00:00:00 2001 From: Timmy Willison <4timmywil@gmail.com> Date: Fri, 29 Oct 2021 16:22:41 -0400 Subject: [PATCH] fix(pan): avoid triggering the pan event if no change Fixes gh-588 --- src/panzoom.ts | 12 +++++++----- test/unit/panzoom.test.ts | 34 ++++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/panzoom.ts b/src/panzoom.ts index be5cb4df..f98c48c5 100644 --- a/src/panzoom.ts +++ b/src/panzoom.ts @@ -291,12 +291,14 @@ function Panzoom( originalEvent?: PanzoomEventDetail['originalEvent'] ) { const result = constrainXY(toX, toY, scale, panOptions) - const opts = result.opts - - x = result.x - y = result.y - return setTransformWithEvent('panzoompan', opts, originalEvent) + // Only try to set if the result is somehow different + if (x !== result.x || y !== result.y) { + x = result.x + y = result.y + return setTransformWithEvent('panzoompan', result.opts, originalEvent) + } + return { x, y, scale, isSVG, originalEvent } } function zoom( diff --git a/test/unit/panzoom.test.ts b/test/unit/panzoom.test.ts index 8a1728b5..6382a07d 100644 --- a/test/unit/panzoom.test.ts +++ b/test/unit/panzoom.test.ts @@ -281,25 +281,38 @@ describe('Panzoom', () => { }) }) }) - describe('force option', () => { - it('ignores disablePan', () => { + describe('disable options', () => { + it('disablePan', async () => { const div = document.createElement('div') document.body.appendChild(div) - const panzoom = Panzoom(div) - panzoom.setOptions({ + const panzoom = Panzoom(div, { disablePan: true }) + const badPanListener = () => { + assert.ok(false, 'panzoompan event should not be triggered') + } + ;(div as any).addEventListener('panzoompan', badPanListener) panzoom.pan(1, 1) + await skipFrame() + ;(div as any).removeEventListener('panzoompan', badPanListener) let pan = panzoom.getPan() assert.strictEqual(pan.x, 0) assert.strictEqual(pan.y, 0) + const goodPanListener = () => { + assert.ok(true, 'panzoompan event should not be triggered') + } + ;(div as any).addEventListener('panzoompan', goodPanListener) + + // force option bypasses panzoom.pan(1, 1, { force: true }) + await skipFrame() + ;(div as any).removeEventListener('panzoompan', goodPanListener) pan = panzoom.getPan() assert.strictEqual(pan.x, 1) assert.strictEqual(pan.y, 1) document.body.removeChild(div) }) - it('ignores disableZoom', () => { + it('disableZoom', () => { const div = document.createElement('div') document.body.appendChild(div) const panzoom = Panzoom(div) @@ -309,22 +322,31 @@ describe('Panzoom', () => { panzoom.zoom(2) let scale = panzoom.getScale() assert.strictEqual(scale, 1) + + // force option bypasses panzoom.zoom(2, { force: true }) scale = panzoom.getScale() assert.strictEqual(scale, 2) document.body.removeChild(div) }) - it('ignores panOnlyWhenZoomed', () => { + it('panOnlyWhenZoomed', () => { const div = document.createElement('div') document.body.appendChild(div) const panzoom = Panzoom(div) panzoom.setOptions({ panOnlyWhenZoomed: true }) + const panListener = () => { + assert.ok(false, 'panzoompan event should not be triggered') + } + ;(div as any).addEventListener('panzoompan', panListener) panzoom.pan(1, 1) + ;(div as any).removeEventListener('panzoompan', panListener) let pan = panzoom.getPan() assert.strictEqual(pan.x, 0) assert.strictEqual(pan.y, 0) + + // force option bypasses panzoom.pan(1, 1, { force: true }) pan = panzoom.getPan() assert.strictEqual(pan.x, 1)