OnTouch листание

fast click : 'fc'
swipe left : 'swl'
swipe right : 'swr'
swipe up : 'swu'
swipe down : 'swd'

<script>
    window.onload = function () {
        (function (d) {
            var ce = function (e, n) {
                    var a = document.createEvent("CustomEvent");
                    a.initCustomEvent(n, true, true, e.target);
                    e.target.dispatchEvent(a);
                    a = null;
                    return false
                },
                nm = true, sp = {x: 0, y: 0}, ep = {x: 0, y: 0},
                touch = {
                    touchstart: function (e) {
                        sp = {x: e.touches[0].pageX, y: e.touches[0].pageY}
                    },
                    touchmove: function (e) {
                        nm = false;
                        ep = {x: e.touches[0].pageX, y: e.touches[0].pageY};
                        i??f(Math.abs(ep.x - sp.x) > 10 && Math.abs(ep.y - sp.y) < 20) e.preventDefault();
                    }
                },
                    touchend: function (e) {
                        if (nm) {
                            ce(e, 'fc')
                        } else {
                            var x = ep.x - sp.x, xr = Math.abs(x), y = ep.y - sp.y, yr = Math.abs(y);
                            if (Math.max(xr, yr) > 20) {
                                ce(e, (xr > yr ? (x < 0 ? 'swl' : 'swr') : (y < 0 ? 'swu' : 'swd')))
                            }
                        };
                        nm = true
                    },
                    touchcancel: function (e) {
                        nm = false
                    }
                };
            for (var a in touch) {
                d.addEventListener(a, touch[a], false);
            }
        })(document);
//EXAMPLE OF USE
        var h = function (e) {
            console.log(e.type, e)
        };
        document.body.addEventListener('fc', h, false);// 0-50ms vs 500ms with normal click
        document.body.addEventListener('swl', h, false);
        document.body.addEventListener('swr', h, false);
        document.body.addEventListener('swu', h, false);
        document.body.addEventListener('swd', h, false);
    }
</script>
<div style="
    width:200px;
    height:200px;
    background-color:grey;
    line-height:200px;
    text-align:center;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -webkit-tap-highlight-color: rgba(0,0,0,0);
    font:24px Arial, sans-serif;"></div>
<script type="text/javascript">
    (function (D) {
        var
            ce = function (e, n) {
                var a = D.createEvent("CustomEvent");
                a.initCustomEvent(n, true, true, e.target);
                e.target.dispatchEvent(a);
                a = null;
                return 1
            },
            m = (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ? 'touch' : 'mouse'),
            nm = 1,
            bd = 0,
            sx,
            sy,
            ex,
            ey,
            M = Math,
            MA = M.abs,
            MM = M.max,
            x,
            y,
            xr,
            yr,
            f = {
                touch: {
                    touchstart: function (e) {
                        return ce(e, (sx = e.touches[0].pageX, sy = e.touches[0].pageY, 'sfc'))
                    },
                    touchmove: function (e) {
                        return nm = 0, ex = e.touches[0].pageX, ey = e.touches[0].pageY, 1
                    },
                    touchend: function (e) {
                        return ce(e, nm ? 'fc' : (x = ex - sx, xr = MA(x), y = ey - sy, yr = MA(y), nm = 1, MM(xr, yr) > 20 ? xr > yr ? x < 0 ? 'swl' : 'swr' : y < 0 ? 'swu' : 'swd' : 'fc'))
                    },
                    touchcancel: function (e) {
                        return nm = 0, 1
                    }
                },
                mouse: {
                    mousedown: function (e) {
                        return e.button || (bd = 1, sx = e.x, sy = e.y, ce(e, 'sfc'))
                    },
                    mousemove: function (e) {
                        return !bd || (nm = 0, ex = e.x, ey = e.y, 1)
                    },
                    mouseup: function (e) {
                        return e.button || (bd = 0, ce(e, nm ? 'fc' : (nm = 1, x = ex - sx, xr = MA(x), y = ey - sy, yr = MA(y), MM(xr, yr) > 20 ? xr > yr ? x < 0 ? 'swl' : 'swr' : y < 0 ? 'swu' : 'swd' : 'fc')))
                    }
                }
            };
        for (var a in f[m]) {
            D.addEventListener(a, f[m][a], false)
        }
    })(document)

    /* USAGE */

    function addAllListeners() {
        function func(e) {
            div.innerHTML = v[e.type];
        }

        var div = document.getElementsByTagName('div')[0],
            a = ['sfc', 'fc', 'swl', 'swr', 'swu', 'swd'], b = a.length,
            v = {
                sfc: 'superFastClick',
                fc: 'fastClick',
                swl: 'left',
                swr: 'right',
                swu: 'up',
                swd: 'down'
            };
        while (b--) {
            div.addEventListener(a[b], func, false)
        }
        div.addEventListener('touchstart', function (e) {
            e.preventDefault()
        }, false);
    }
    //window.addEventListener('load',addAllListeners,false)
    addAllListeners();
    /* USAGE */
</script>

.