PageSourceSearch

https://markformelle.by/local/templates/markformelle/js/swipe.js?16492244189516

js markformelle.by collected 2026-09-25 13:57:19 UTC 9,516 bytes, 181 lines download raw bytes

1/**
2 * Object.assign() polyfill
3 */
4Object.assign||Object.defineProperty(Object,"assign",{enumerable:!1,configurable:!0,writable:!0,value:function(a,b){"use strict";if(void 0===a||null===a)error("Cannot convert first argument to object");for(var c=Object(a),d=1;d<arguments.length;d++){var e=arguments[d];if(void 0!==e&&null!==e)for(var f=Object.keys(Object(e)),g=0,h=f.length;g<h;g++){var i=f[g],j=Object.getOwnPropertyDescriptor(e,i);void 0!==j&&j.enumerable&&(c[i]=e[i])}}return c}});
5
6/**
7 * CustomEvent() polyfill
8 */
9!function(){if("function"==typeof window.CustomEvent)return;function t(t,e){e=e||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),n}t.prototype=window.Event.prototype,window.CustomEvent=t}();
10
11
12/**
13 * Функция определения события swipe на элементе.
14 * @param {Object} el - элемент DOM.
15 * @param {Object} settings - объект с предварительными настройками.
16 */
17var swipe = function(el, settings) {
18    // настройки по умолчанию
19    var settings = Object.assign({}, {
20        minDist: 60,  // минимальная дистанция, которую должен пройти указатель, чтобы жест считался как свайп (px)
21        maxDist: 120, // максимальная дистанция, не превышая которую может пройти указатель, чтобы жест считался как свайп (px)
22        maxTime: 700, // максимальное время, за которое должен быть совершен свайп (ms)
23        minTime: 50   // минимальное время, за которое должен быть совершен свайп (ms)
24    }, settings);
25
26    // коррекция времени при ошибочных значениях
27    if (settings.maxTime < settings.minTime) settings.maxTime = settings.minTime + 500;
28    if (settings.maxTime < 100 || settings.minTime < 50) {
29        settings.maxTime = 700;
30        settings.minTime = 30;
31    }
32
33    var dir,                // направление свайпа (horizontal, vertical)
34        swipeType,            // тип свайпа (up, down, left, right)
35        dist,                 // дистанция, пройденная указателем
36        isMouse = false,      // поддержка мыши (не используется для тач-событий)
37        isMouseDown = false,  // указание на активное нажатие мыши (не используется для тач-событий)
38        startX = 0,           // начало координат по оси X (pageX)
39        distX = 0,            // дистанция, пройденная указателем по оси X
40        startY = 0,           // начало координат по оси Y (pageY)
41        distY = 0,            // дистанция, пройденная указателем по оси Y
42        startTime = 0,        // время начала касания
43        support = {           // поддерживаемые браузером типы событий
44            pointer: !!("PointerEvent" in window || ("msPointerEnabled" in window.navigator)),
45            touch: !!(typeof window.orientation !== "undefined" || /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || "ontouchstart" in window || navigator.msMaxTouchPoints || "maxTouchPoints" in window.navigator > 1 || "msMaxTouchPoints" in window.navigator > 1)
46        };
47
48    /**
49     * Опредление доступных в браузере событий: pointer, touch и mouse.
50     * @returns {Object} - возвращает объект с доступными событиями.
51     */
52    var getSupportedEvents = function() {
53        switch (true) {
54            case support.pointer:
55                events = {
56                    type:   "pointer",
57                    start:  "PointerDown",
58                    move:   "PointerMove",
59                    end:    "PointerUp",
60                    cancel: "PointerCancel",
61                    leave:  "PointerLeave"
62                };
63                // добавление префиксов для IE10
64                var ie10 = (window.navigator.msPointerEnabled && Function('/*@cc_on return document.documentMode===10@*/')());
65                for (var value in events) {
66                    if (value === "type") continue;
67                    events[value] = (ie10) ? "MS" + events[value] : events[value].toLowerCase();
68                }
69                break;
70            case support.touch:
71                events = {
72                    type:   "touch",
73                    start:  "touchstart",
74                    move:   "touchmove",
75                    end:    "touchend",
76                    cancel: "touchcancel"
77                };
78                break;
79            default:
80                events = {
81                    type:  "mouse",
82                    start: "mousedown",
83                    move:  "mousemove",
84                    end:   "mouseup",
85                    leave: "mouseleave"
86                };
87                break;
88        }
89        return events;
90    };
91
92
93    /**
94     * Объединение событий mouse/pointer и touch.
95     * @param e {Event} - принимает в качестве аргумента событие.
96     * @returns {TouchList|Event} - возвращает либо TouchList, либо оставляет событие без изменения.
97     */
98    var eventsUnify = function(e) {
99        return e.changedTouches ? e.changedTouches[0] : e;
100    };
101
102
103    /**
104     * Обрабочик начала касания указателем.
105     * @param e {Event} - получает событие.
106     */
107    var checkStart = function(e) {
108        var event = eventsUnify(e);
109        if (support.touch && typeof e.touches !== "undefined" && e.touches.length !== 1) return; // игнорирование касания несколькими пальцами
110        dir = "none";
111        swipeType = "none";
112        dist = 0;
113        startX = event.pageX;
114        startY = event.pageY;
115        startTime = new Date().getTime();
116        if (isMouse) isMouseDown = true; // поддержка мыши
117    };
118
119    /**
120     * Обработчик движения указателя.
121     * @param e {Event} - получает событие.
122     */
123    var checkMove = function(e) {
124        if (isMouse && !isMouseDown) return; // выход из функции, если мышь перестала быть активна во время движения
125        var event = eventsUnify(e);
126        distX = event.pageX - startX;
127        distY = event.pageY - startY;
128        if (Math.abs(distX) > Math.abs(distY)) dir = (distX < 0) ? "left" : "right";
129        else dir = (distY < 0) ? "up" : "down";
130    };
131
132    /**
133     * Обработчик окончания касания указателем.
134     * @param e {Event} - получает событие.
135     */
136    var checkEnd = function(e) {
137        if (isMouse && !isMouseDown) { // выход из функции и сброс проверки нажатия мыши
138            isMouseDown = false;
139            return;
140        }
141        var endTime = new Date().getTime();
142        var time = endTime - startTime;
143        if (time >= settings.minTime && time <= settings.maxTime) { // проверка времени жеста
144            if (Math.abs(distX) >= settings.minDist && Math.abs(distY) <= settings.maxDist) {
145                swipeType = dir; // опредление типа свайпа как "left" или "right"
146            } else if (Math.abs(distY) >= settings.minDist && Math.abs(distX) <= settings.maxDist) {
147                swipeType = dir; // опредление типа свайпа как "top" или "down"
148            }
149        }
150        dist = (dir === "left" || dir === "right") ? Math.abs(distX) : Math.abs(distY); // опредление пройденной указателем дистанции
151
152        // генерация кастомного события swipe
153        if (swipeType !== "none" && dist >= settings.minDist) {
154            var swipeEvent = new CustomEvent("swipe", {
155                bubbles: true,
156                cancelable: true,
157                detail: {
158                    full: e, // полное событие Event
159                    dir:  swipeType, // направление свайпа
160                    dist: dist, // дистанция свайпа
161                    time: time // время, потраченное на свайп
162                }
163            });
164            el.dispatchEvent(swipeEvent);
165        }
166    };
167
168    // добавление поддерживаемых событий
169    var events = getSupportedEvents();
170
171    // проверка наличия мыши
172    if ((support.pointer && !support.touch) || events.type === "mouse") isMouse = true;
173
174    // добавление обработчиков на элемент
175    el.addEventListener(events.start, checkStart);
176    el.addEventListener(events.move, checkMove);
177    el.addEventListener(events.end, checkEnd);
178    if(support.pointer && support.touch) {
179        el.addEventListener('lostpointercapture', checkEnd);
180    }
181};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.