From b4cfec5296875e1b243d97ad53610919d1be1670 Mon Sep 17 00:00:00 2001 From: gndn Date: Tue, 2 Jun 2020 10:39:53 +0300 Subject: [PATCH 1/3] Update exit-intent.js --- src/exit-intent.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exit-intent.js b/src/exit-intent.js index 077ec6b..e181a96 100644 --- a/src/exit-intent.js +++ b/src/exit-intent.js @@ -44,7 +44,7 @@ export default function ExitIntent (options = {}) { // =========================== // EVENT LISTENERS // DESKTOP: MOUSEOUT event - const onMouse = () => { + const onMouse = (e) => { if (!(e instanceof MouseEvent)) { return; } From 47ebe57997fdf2d1f98885546a89d73f49ce5064 Mon Sep 17 00:00:00 2001 From: Lior Chen Date: Fri, 12 Jun 2020 11:50:21 +0300 Subject: [PATCH 2/3] mouse leave/scroll... --- package.json | 6 ++-- src/exit-intent.js | 78 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 69 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index fb5e9b8..3270184 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "exit-intent-mobile", - "version": "1.2.0", + "name": "exit-intent-mobile-bugfix", + "version": "1.2.7", "description": "Exit intent detection library. Including support for desktop and mobile.", "keywords": [ "exit", @@ -61,7 +61,7 @@ "lint-staged": "4.2.1", "prettier": "1.7.0", "prettier-eslint-cli": "4.3.2", - "rollup": "0.50.0", + "rollup": "^0.50.0", "rollup-plugin-babel": "3.0.2", "rollup-plugin-commonjs": "8.2.1", "rollup-plugin-node-resolve": "3.0.0", diff --git a/src/exit-intent.js b/src/exit-intent.js index e181a96..f16085b 100644 --- a/src/exit-intent.js +++ b/src/exit-intent.js @@ -2,6 +2,27 @@ import throttle from 'lodash/throttle' import isTouchDevice from 'is-touch-device' import {addWheelListener, removeWheelListener} from 'wheel' const isDesktop = !isTouchDevice() + +const myScroll = (function(){ //Function that checks the speed of scrolling + var last_position, new_position, timer, delta, delay = 50; + function clear() { + last_position = null; + delta = 0; + } + + clear(); + return function(){ + new_position = window.scrollY; + if ( last_position != null ){ + delta = new_position - last_position; + } + last_position = new_position; + clearTimeout(timer); + timer = setTimeout(clear, delay); + return delta; + }; +})(); + /** * References * => original https://www.npmjs.com/package/exit-intent @@ -18,6 +39,7 @@ export default function ExitIntent (options = {}) { onExitIntent: () => {} } const config = {...defaultOptions, ...options} + let cleared = false; const log = (...args) => { if (config.debug) { console.log('[exit-intent-mobile]', ...args) @@ -28,7 +50,7 @@ export default function ExitIntent (options = {}) { // ... DISPLAY (only maxDisplays-times) let displays = 0 const doDisplay = () => { - if (displays < config.maxDisplays) { + if (!cleared && displays < config.maxDisplays) { displays++ log('display onExitIntent', displays) config.onExitIntent() @@ -48,14 +70,20 @@ export default function ExitIntent (options = {}) { if (!(e instanceof MouseEvent)) { return; } - log('mouseleave') - display() + + if ( + e.clientY < 50 && + e.relatedTarget == null && + e.target.nodeName.toLowerCase() !== 'select') { + log('mouseout') + display() + } } let onMouseLeaveListener if (isDesktop) { log('register mouseleave for desktop') onMouseLeaveListener = document.body.addEventListener( - 'mouseleave', + 'mouseout', throttle(onMouse, config.eventThrottle), false ) @@ -87,14 +115,37 @@ export default function ExitIntent (options = {}) { const listeners = [] // array to store listeners const registerEvent = (event, target) => { log('registering event for restartTimer', event, target) + + const defaultCB = throttle(event => { + log('throttled listener', event) + restartTimer() + }, config.eventThrottle); + let cb = null; + if(event === 'scroll') { + cb = function(e) { + if(myScroll() < -200) { + log('scroll') + display(); + } + defaultCB(e); + } + } else if(event === 'mousemove') { + cb = function(e) { + if(e.clientY < 50) { + log('intent-to-leave') + display(); + } + defaultCB(e); + } + } + else { + cb = defaultCB; + } const listener = target.addEventListener( event, - throttle(event => { - log('throttled listener', event) - restartTimer() - }, config.eventThrottle), + cb, false - ) + ); listeners.push({event, listener, target}) return listener } @@ -109,14 +160,17 @@ export default function ExitIntent (options = {}) { }) } if (isTouchDevice) { - registerEvent('touchstart', document.body) - registerEvent('touchend', document.body) - registerEvent('touchmove', document.body) + registerEvent('touchstart', document.body); + registerEvent('touchend', document.body); + registerEvent('touchmove', document.body); + registerEvent('scroll', window); + } // =========================== // CLEANUP const removeEvents = () => { log('removeEvents', displays) + cleared = true; if (onMouseLeaveListener) { document.body.removeEventListener('mouseleave', onMouseLeaveListener) removeWheelListener(window, () => { From 07cbc1b2628a7f703fac5239041a8f4212b67710 Mon Sep 17 00:00:00 2001 From: Lior Chen Date: Fri, 12 Jun 2020 11:55:27 +0300 Subject: [PATCH 3/3] package json --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3270184..78aa8ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "exit-intent-mobile-bugfix", - "version": "1.2.7", + "version": "1.2.8", "description": "Exit intent detection library. Including support for desktop and mobile.", "keywords": [ "exit", @@ -12,7 +12,7 @@ "conversion", "rates" ], - "author": "thebarty", + "author": "liorchen", "license": "MIT", "main": "dist/exit-intent.js", "module": "dist/exit-intent.es.js", @@ -77,10 +77,10 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/thebarty/exit-intent.git" + "url": "git+https://github.com/liorchen/exit-intent" }, "bugs": { - "url": "https://github.com/thebarty/exit-intent/issues" + "url": "https://github.com/liorchen/exit-intent/issues" }, - "homepage": "https://github.com/thebarty/exit-intent#readme" + "homepage": "https://github.com/liorchen/exit-intent#readme" }