PageSourceSearch

https://phuket-cheap-tour.ru/wp-content/themes/phuket/js/fancybox-photo-hits.js?ver=1790767872

js phuket-cheap-tour.ru collected 2026-09-30 11:32:06 UTC 4,349 bytes, 150 lines download raw bytes

1/**
2 * Виртуальные просмотры фото во всплывающем Fancybox для Яндекс.Метрики.
3 * Не зависит от конкретной копии jQuery: следит за DOM попапа.
4 * При каждом слайде адрес меняется на URL картинки, слайдер остаётся поверх страницы.
5 */
6(function () {
7    var METRIKA_ID = 7513753;
8    var originalUrl = null;
9    var lastHit = "";
10    var lastImageUrl = "";
11    var pollTimer = null;
12
13    function pageUrl() {
14        return window.location.origin + window.location.pathname + window.location.search;
15    }
16
17    function isImageUrl(url) {
18        return /\.(jpe?g|png|gif|webp|svg|bmp|avif)(\?|#|$)/i.test(url || "");
19    }
20
21    function absUrl(url) {
22        if (!url) {
23            return null;
24        }
25        try {
26            return new URL(url, window.location.href).toString();
27        } catch (e) {
28            return url;
29        }
30    }
31
32    function sameOrigin(url) {
33        try {
34            return new URL(url, window.location.href).origin === window.location.origin;
35        } catch (e) {
36            return false;
37        }
38    }
39
40    function fancyboxRoot() {
41        return document.querySelector(".fancybox-container.fancybox-is-open, .fancybox-container:not(.fancybox-is-closing)");
42    }
43
44    function currentImageUrl() {
45        var root = fancyboxRoot();
46        if (!root) {
47            return null;
48        }
49
50        var slide = root.querySelector(".fancybox-slide--current");
51        var img = slide ? slide.querySelector("img.fancybox-image") : null;
52        var src = img ? (img.getAttribute("src") || img.currentSrc) : "";
53
54        if (!src) {
55            var download = root.querySelector("[data-fancybox-download]");
56            src = download ? download.getAttribute("href") : "";
57        }
58
59        src = absUrl(src);
60        return src && isImageUrl(src) ? src : null;
61    }
62
63    function setAddress(url) {
64        if (!url || !sameOrigin(url)) {
65            return;
66        }
67        try {
68            if (window.location.href !== url) {
69                history.replaceState({ pctPhotoHit: true }, "", url);
70            }
71        } catch (e) {}
72    }
73
74    function trackHit(url) {
75        if (typeof ym !== "function" || !url || url === lastHit) {
76            return;
77        }
78        ym(METRIKA_ID, "hit", url, {
79            title: document.title,
80            referer: originalUrl || document.referrer || ""
81        });
82        lastHit = url;
83    }
84
85    function onOpenOrSlide() {
86        var url = currentImageUrl();
87        if (!url) {
88            return;
89        }
90        if (!originalUrl) {
91            originalUrl = isImageUrl(window.location.href) ? pageUrl() : pageUrl();
92        }
93        if (url === lastImageUrl) {
94            setAddress(url);
95            return;
96        }
97        lastImageUrl = url;
98        setAddress(url);
99        trackHit(url);
100    }
101
102    function onClose() {
103        lastImageUrl = "";
104        lastHit = "";
105        if (originalUrl) {
106            setAddress(originalUrl);
107        }
108        originalUrl = null;
109    }
110
111    function startPoll() {
112        if (pollTimer) {
113            return;
114        }
115        pollTimer = setInterval(function () {
116            if (fancyboxRoot()) {
117                onOpenOrSlide();
118            } else if (originalUrl || lastImageUrl) {
119                onClose();
120                clearInterval(pollTimer);
121                pollTimer = null;
122            }
123        }, 120);
124    }
125
126    document.addEventListener("click", function (e) {
127        var link = e.target && e.target.closest ? e.target.closest("[data-fancybox]") : null;
128        if (!link) {
129            return;
130        }
131        if (!originalUrl) {
132            originalUrl = pageUrl();
133        }
134        startPoll();
135        setTimeout(onOpenOrSlide, 50);
136        setTimeout(onOpenOrSlide, 350);
137    }, true);
138
139    document.addEventListener("keydown", function () {
140        if (fancyboxRoot()) {
141            startPoll();
142        }
143    }, true);
144
145    if (document.body) {
146        startPoll();
147    } else {
148        document.addEventListener("DOMContentLoaded", startPoll);
149    }
150})();

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.