Skip to content

Commit

Permalink
Fix: Scroll background from popups (#368)
Browse files Browse the repository at this point in the history
* Fix: Scroll background from popups

* Fix: Safari, keep event listeners attached
  • Loading branch information
oliverfoster authored May 5, 2023
1 parent b20e6f8 commit 53c9098
Showing 1 changed file with 11 additions and 14 deletions.
25 changes: 11 additions & 14 deletions js/a11y/scroll.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ export default class Scroll extends Backbone.Controller {
this._ignoreKeysOnElementsMatching = 'textarea, input, select';
this._isRunning = false;
this._touchStartEventObject = null;
window.addEventListener('touchstart', this._onTouchStart); // mobile
window.addEventListener('touchend', this._onTouchEnd); // mobile
window.addEventListener('touchmove', this._onScrollEvent, { passive: false }); // mobile
window.addEventListener('wheel', this._onScrollEvent, { passive: false });
document.addEventListener('wheel', this._onScrollEvent, { passive: false });
document.addEventListener('keydown', this._onKeyDown);
}

/**
Expand Down Expand Up @@ -84,12 +90,6 @@ export default class Scroll extends Backbone.Controller {
return;
}
this._isRunning = true;
window.addEventListener('touchstart', this._onTouchStart); // mobile
window.addEventListener('touchend', this._onTouchEnd); // mobile
window.addEventListener('touchmove', this._onScrollEvent, { passive: false }); // mobile
window.addEventListener('wheel', this._onScrollEvent, { passive: false });
document.addEventListener('wheel', this._onScrollEvent, { passive: false });
document.addEventListener('keydown', this._onKeyDown);
}

/**
Expand All @@ -98,6 +98,7 @@ export default class Scroll extends Backbone.Controller {
* @param {JQuery.Event} event
*/
_onTouchStart(event) {
if (!this._isRunning) return;
event = $.event.fix(event);
this._touchStartEventObject = event;
return true;
Expand All @@ -107,6 +108,7 @@ export default class Scroll extends Backbone.Controller {
* Clear touchstart event object.
*/
_onTouchEnd() {
if (!this._isRunning) return;
this._touchStartEventObject = null;
return true;
}
Expand All @@ -117,6 +119,7 @@ export default class Scroll extends Backbone.Controller {
* @param {JQuery.Event} event
*/
_onScrollEvent(event) {
if (!this._isRunning) return;
event = $.event.fix(event);
return this._preventScroll(event);
}
Expand All @@ -127,6 +130,7 @@ export default class Scroll extends Backbone.Controller {
* @param {JQuery.Event} event
*/
_onKeyDown(event) {
if (!this._isRunning) return;
event = $.event.fix(event);
if (!this._preventScrollOnKeys[event.which]) {
return;
Expand Down Expand Up @@ -183,7 +187,7 @@ export default class Scroll extends Backbone.Controller {
const isTouchEvent = event.type === 'touchmove';
const isKeyDownEvent = event.type === 'keydown';
const hasTouchStartEvent = this._touchStartEventObject?.originalEvent;
if ((isTouchEvent && !hasTouchStartEvent) || !isKeyDownEvent) {
if ((isTouchEvent && !hasTouchStartEvent) && !isKeyDownEvent) {
return $target;
}
const directionY = this._getScrollDirection(event);
Expand Down Expand Up @@ -322,13 +326,6 @@ export default class Scroll extends Backbone.Controller {
return;
}
this._isRunning = false;
window.removeEventListener('touchstart', this._onTouchStart); // mobile
window.removeEventListener('touchend', this._onTouchEnd); // mobile
// shouldn't need to supply 3rd arg when removing, but IE11 won't remove the event listener if you don't - see https://github.com/adaptlearning/adapt_framework/issues/2466
window.removeEventListener('touchmove', this._onScrollEvent, { passive: false }); // mobile
window.removeEventListener('wheel', this._onScrollEvent, { passive: false });
document.removeEventListener('wheel', this._onScrollEvent, { passive: false });
document.removeEventListener('keydown', this._onKeyDown);
}

}

0 comments on commit 53c9098

Please sign in to comment.