PageSourceSearch

https://www.heubach.de/site/Heubach-2024/resourceCached/24.2.9/js/karten/leaflet/leaflet-gesture-handling.js

js heubach.de collected 2026-10-02 19:01:59 UTC 9,509 bytes, 283 lines download raw bytes

vendor: 9,509 bytes, lines 1-283
1/*
2* * Leaflet Gesture Handling **
3* * Version 1.1.8
4*/
5import LanguageContent from "./language-content.js";
6
7L.Map.mergeOptions({
8    gestureHandlingOptions: {
9        text: {},
10        duration: 1000
11    }
12});
13
14var draggingMap = false;
15
16export var GestureHandling = L.Handler.extend({
17    addHooks: function() {
18        this._handleTouch = this._handleTouch.bind(this);
19
20        this._setupPluginOptions();
21        this._setLanguageContent();
22        this._disableInteractions();
23
24        //Uses native event listeners instead of L.DomEvent due to issues with Android touch events
25        //turning into pointer events
26        this._map._container.addEventListener("touchstart", this._handleTouch);
27        this._map._container.addEventListener("touchmove", this._handleTouch);
28        this._map._container.addEventListener("touchend", this._handleTouch);
29        this._map._container.addEventListener("touchcancel", this._handleTouch);
30        this._map._container.addEventListener("click", this._handleTouch);
31
32        L.DomEvent.on(
33            this._map._container,
34            "wheel",
35            this._handleScroll,
36            this
37        );
38        L.DomEvent.on(this._map, "mouseover", this._handleMouseOver, this);
39        L.DomEvent.on(this._map, "mouseout", this._handleMouseOut, this);
40
41        // Listen to these events so will not disable dragging if the user moves the mouse out the boundary of the map container whilst actively dragging the map.
42        L.DomEvent.on(this._map, "movestart", this._handleDragging, this);
43        L.DomEvent.on(this._map, "move", this._handleDragging, this);
44        L.DomEvent.on(this._map, "moveend", this._handleDragging, this);
45    },
46
47    removeHooks: function() {
48        this._enableInteractions();
49
50        this._map._container.removeEventListener(
51            "touchstart",
52            this._handleTouch
53        );
54        this._map._container.removeEventListener(
55            "touchmove",
56            this._handleTouch
57        );
58        this._map._container.removeEventListener("touchend", this._handleTouch);
59        this._map._container.removeEventListener(
60            "touchcancel",
61            this._handleTouch
62        );
63        this._map._container.removeEventListener("click", this._handleTouch);
64
65        L.DomEvent.off(
66            this._map._container,
67            "wheel",
68            this._handleScroll,
69            this
70        );
71        L.DomEvent.off(this._map, "mouseover", this._handleMouseOver, this);
72        L.DomEvent.off(this._map, "mouseout", this._handleMouseOut, this);
73
74        L.DomEvent.off(this._map, "movestart", this._handleDragging, this);
75        L.DomEvent.off(this._map, "move", this._handleDragging, this);
76        L.DomEvent.off(this._map, "moveend", this._handleDragging, this);
77    },
78
79    _handleDragging: function(e) {
80        if (e.type == "movestart" || e.type == "move") {
81            draggingMap = true;
82        } else if (e.type == "moveend") {
83            draggingMap = false;
84        }
85    },
86
87    _disableInteractions: function() {
88        this._map.dragging.disable();
89        this._map.scrollWheelZoom.disable();
90        if (this._map.tap) {
91            this._map.tap.disable();
92        }
93    },
94
95    _enableInteractions: function() {
96        this._map.dragging.enable();
97        this._map.scrollWheelZoom.enable();
98        if (this._map.tap) {
99            this._map.tap.enable();
100        }
101    },
102
103    _setupPluginOptions: function() {
104        //For backwards compatibility, merge gestureHandlingText into the new options object
105        if (this._map.options.gestureHandlingText) {
106            this._map.options.gestureHandlingOptions.text = this._map.options.gestureHandlingText;
107        }
108    },
109
110    _setLanguageContent: function() {
111        var languageContent;
112        //If user has supplied custom language, use that
113        if (
114            this._map.options.gestureHandlingOptions &&
115            this._map.options.gestureHandlingOptions.text &&
116            this._map.options.gestureHandlingOptions.text.touch &&
117            this._map.options.gestureHandlingOptions.text.scroll &&
118            this._map.options.gestureHandlingOptions.text.scrollMac
119        ) {
120            languageContent = this._map.options.gestureHandlingOptions.text;
121        } else {
122            //Otherwise auto set it from the language files
123
124            //Determine their language e.g fr or en-US
125            var lang = this._getUserLanguage();
126
127            //If we couldn't find it default to en
128            if (!lang) {
129                lang = "en";
130            }
131
132            //Lookup the appropriate language content
133            if (LanguageContent[lang]) {
134                languageContent = LanguageContent[lang];
135            }
136
137            //If no result, try searching by the first part only. e.g en-US just use en.
138            if (!languageContent && lang.indexOf("-") !== -1) {
139                lang = lang.split("-")[0];
140                languageContent = LanguageContent[lang];
141            }
142
143            if (!languageContent) {
144                // If still nothing, default to English
145                // console.log("No lang found for", lang);
146                lang = "en";
147                languageContent = LanguageContent[lang];
148            }
149        }
150
151        //TEST
152        // languageContent = LanguageContent["bg"];
153
154        //Check if they're on a mac for display of command instead of ctrl
155        var mac = false;
156        if (navigator.platform.toUpperCase().indexOf("MAC") >= 0) {
157            mac = true;
158        }
159
160        var scrollContent = languageContent.scroll;
161        if (mac) {
162            scrollContent = languageContent.scrollMac;
163        }
164
165        this._map._container.setAttribute(
166            "data-gesture-handling-touch-content",
167            languageContent.touch
168        );
169        this._map._container.setAttribute(
170            "data-gesture-handling-scroll-content",
171            scrollContent
172        );
173    },
174
175    _getUserLanguage: function() {
176        var lang = navigator.languages
177            ? navigator.languages[0]
178            : navigator.language || navigator.userLanguage;
179        return lang;
180    },
181
182    _handleTouch: function(e) {
183        //Disregard touch events on the minimap if present
184        var ignoreList = [
185            "leaflet-control-minimap",
186            "leaflet-interactive",
187            "leaflet-popup-content",
188            "leaflet-popup-content-wrapper",
189            "leaflet-popup-close-button",
190            "leaflet-control-zoom-in",
191            "leaflet-control-zoom-out"
192        ];
193
194        var ignoreElement = false;
195        for (var i = 0; i < ignoreList.length; i++) {
196            if (L.DomUtil.hasClass(e.target, ignoreList[i])) {
197                ignoreElement = true;
198            }
199        }
200
201        if (ignoreElement) {
202            if (
203                L.DomUtil.hasClass(e.target, "leaflet-interactive") &&
204                e.type === "touchmove" &&
205                e.touches.length === 1
206            ) {
207                L.DomUtil.addClass(this._map._container,
208                    "leaflet-gesture-handling-touch-warning"
209                );
210                this._disableInteractions();
211            } else {
212                L.DomUtil.removeClass(this._map._container, 
213                    "leaflet-gesture-handling-touch-warning"
214                );
215            }
216            return;
217        }
218        // screenLog(e.type+' '+e.touches.length);
219        if (e.type !== "touchmove" && e.type !== "touchstart") {
220            L.DomUtil.removeClass(this._map._container,
221                "leaflet-gesture-handling-touch-warning"
222            );
223            return;
224        }
225        if (e.touches.length === 1) {
226            L.DomUtil.addClass(this._map._container, 
227                "leaflet-gesture-handling-touch-warning"
228            );
229            this._disableInteractions();
230        } else {
231            e.preventDefault();
232            this._enableInteractions();
233            L.DomUtil.removeClass(this._map._container, 
234                "leaflet-gesture-handling-touch-warning"
235            );
236        }
237    },
238
239    _isScrolling: false,
240
241    _handleScroll: function(e) {
242        if (e.metaKey || e.ctrlKey) {
243            e.preventDefault();
244            L.DomUtil.removeClass(this._map._container,
245                "leaflet-gesture-handling-scroll-warning"
246            );
247            this._map.scrollWheelZoom.enable();
248        } else {
249            L.DomUtil.addClass(this._map._container,
250                "leaflet-gesture-handling-scroll-warning"
251            );
252            this._map.scrollWheelZoom.disable();
253
254            clearTimeout(this._isScrolling);
255
256            // Set a timeout to run after scrolling ends
257            this._isScrolling = setTimeout(function() {
258                // Run the callback
259                var warnings = document.getElementsByClassName(
260                    "leaflet-gesture-handling-scroll-warning"
261                );
262                for (var i = 0; i < warnings.length; i++) {
263                    L.DomUtil.removeClass(warnings[i],
264                        "leaflet-gesture-handling-scroll-warning"
265                    );
266                }
267            }, this._map.options.gestureHandlingOptions.duration);
268        }
269    },
270
271    _handleMouseOver: function(e) {
272        this._enableInteractions();
273    },
274
275    _handleMouseOut: function(e) {
276        if (!draggingMap) {
277            this._disableInteractions();
278        }
279    }
280
281});
282L.Map.addInitHook("addHandler", "gestureHandling", GestureHandling);
283

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.