From b4dc4f85b0cf4f94aaee41e7dd41d87ed36ac945 Mon Sep 17 00:00:00 2001 From: mister-ben Date: Wed, 28 Jun 2017 07:36:06 +0100 Subject: [PATCH] fix: Use passive event listeners for touchstart/touchmove (#4440) If passive event listening is supported, we should use it. Fixes #4432. --- src/js/utils/events.js | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/js/utils/events.js b/src/js/utils/events.js index 428ee32f78..281ce4884e 100644 --- a/src/js/utils/events.js +++ b/src/js/utils/events.js @@ -202,6 +202,33 @@ export function fixEvent(event) { return event; } +/** + * Whether passive event listeners are supported + */ +let _supportsPassive = false; + +(function() { + try { + const opts = Object.defineProperty({}, 'passive', { + get() { + _supportsPassive = true; + } + }); + + window.addEventListener('test', null, opts); + } catch (e) { + // disregard + } +})(); + +/** + * Touch events Chrome expects to be passive + */ +const passiveEvents = [ + 'touchstart', + 'touchmove' +]; + /** * Add an event listener to element * It stores the handler function in a separate cache object @@ -273,7 +300,13 @@ export function on(elem, type, fn) { if (data.handlers[type].length === 1) { if (elem.addEventListener) { - elem.addEventListener(type, data.dispatcher, false); + let options = false; + + if (_supportsPassive && + passiveEvents.indexOf(type) > -1) { + options = {passive: true}; + } + elem.addEventListener(type, data.dispatcher, options); } else if (elem.attachEvent) { elem.attachEvent('on' + type, data.dispatcher); }