From c5140ef3fb3146eb5a580beda254ae2bf4b6002c Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Wed, 4 Dec 2019 16:45:23 +0100 Subject: [PATCH] FIX: prevents multiple jumps to happen with LockOn (#8460) --- .../javascripts/discourse/lib/lock-on.js.es6 | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/lock-on.js.es6 b/app/assets/javascripts/discourse/lib/lock-on.js.es6 index a2ea547ea3c..13720bfeece 100644 --- a/app/assets/javascripts/discourse/lib/lock-on.js.es6 +++ b/app/assets/javascripts/discourse/lib/lock-on.js.es6 @@ -51,23 +51,25 @@ export default class LockOn { lock() { const startedAt = new Date().getTime(); let previousTop = this.elementTop(); + previousTop && $(window).scrollTop(previousTop); const interval = setInterval(() => { - if (!previousTop) { - previousTop = this.elementTop(); - previousTop && $(window).scrollTop(previousTop); - } else { - const top = Math.max(0, this.elementTop()); - const scrollTop = $(window).scrollTop(); + const elementTop = this.elementTop(); + if (!previousTop && !elementTop) { + // we can't find the element yet, wait a little bit more + return; + } - if (typeof top === "undefined" || isNaN(top)) { - return this.clearLock(interval); - } + const top = Math.max(0, elementTop); + const scrollTop = $(window).scrollTop(); - if (!within(4, top, previousTop) || !within(4, scrollTop, top)) { - $(window).scrollTop(top); - previousTop = top; - } + if (typeof top === "undefined" || isNaN(top)) { + return this.clearLock(interval); + } + + if (!within(4, top, previousTop) || !within(4, scrollTop, top)) { + $(window).scrollTop(top); + previousTop = top; } // Commit suicide after a little while