PageSourceSearch

https://tangierslounge.ru/wp-content/themes/tangiers-lounge/js/gallery-lightbox.js?ver=1.2.1

js tangierslounge.ru collected 2026-10-07 13:05:29 UTC 3,709 bytes, 89 lines download raw bytes

1/**
2 * Инициализация лайтбокса галереи (GLightbox).
3 *
4 * Фото в кастомном слайдере (.galleryAnim) обёрнуты в
5 * <a class="glightbox" data-gallery="tl-gallery"> (см. шаблоны). Swiper в
6 * режиме loop клонирует слайды, поэтому НЕ используем декларативный selector
7 * (иначе клоны попали бы в лайтбокс дублями). Вместо этого собираем список
8 * кадров из РЕАЛЬНЫХ (не клонированных) слайдов и открываем нужный индекс:
9 *   - кликом по фото (делегирование ловит клик и по клонам);
10 *   - кнопкой в слайдере (galleryAnim__remove) — через window.tlGalleryLightbox.
11 * swiper.realIndex и data-swiper-slide-index совпадают с индексами этого списка.
12 */
13(function () {
14  "use strict";
15
16  function init() {
17    if (typeof window.GLightbox !== "function") return;
18
19    var slider = document.querySelector(".galleryAnim__slider");
20
21    // Фолбэк: если кастомного слайдера нет — обычная декларативная подача.
22    if (!slider) {
23      window.GLightbox({
24        selector: ".glightbox",
25        loop: true,
26        zoomable: true,
27        touchNavigation: true,
28        openEffect: "fade",
29        closeEffect: "fade",
30        slideEffect: "fade"
31      });
32      return;
33    }
34
35    var realAnchors = slider.querySelectorAll(
36      ".swiper-slide:not(.swiper-slide-duplicate) a.glightbox"
37    );
38    var elements = Array.prototype.map.call(realAnchors, function (a) {
39      return { href: a.getAttribute("href"), type: "image" };
40    });
41    if (!elements.length) return;
42
43    // Прыжок страницы наверх при открытии лечится чисто в CSS
44    // (styles/gallery-lightbox.css, правило html.glightbox-open): GLightbox менял
45    // overflow/height корневого <html> — а это скролл-контейнер при
46    // html,body{height:100%} — и сбрасывал scrollTop. Здесь со скроллом делать
47    // ничего не нужно.
48    var lightbox = window.GLightbox({
49      elements: elements,
50      loop: true,
51      zoomable: true,
52      touchNavigation: true,
53      openEffect: "fade",
54      closeEffect: "fade",
55      slideEffect: "fade"
56    });
57
58    // Индекс реального слайда (устойчив к клонам loop-режима).
59    function realIndexOf(slide) {
60      if (!slide) return 0;
61      var attr = slide.getAttribute("data-swiper-slide-index");
62      if (attr !== null && attr !== "" && !isNaN(parseInt(attr, 10))) {
63        return parseInt(attr, 10);
64      }
65      var reals = slider.querySelectorAll(
66        ".swiper-slide:not(.swiper-slide-duplicate)"
67      );
68      var pos = Array.prototype.indexOf.call(reals, slide);
69      return pos < 0 ? 0 : pos;
70    }
71
72    // Клик по фото открывает лайтбокс на текущем кадре.
73    slider.addEventListener("click", function (e) {
74      var link = e.target.closest("a.glightbox");
75      if (!link) return;
76      e.preventDefault();
77      lightbox.openAt(realIndexOf(link.closest(".swiper-slide")));
78    });
79
80    // Наружу — чтобы кнопка в script.js открывала текущий кадр слайдера.
81    window.tlGalleryLightbox = lightbox;
82  }
83
84  if (document.readyState === "loading") {
85    document.addEventListener("DOMContentLoaded", init);
86  } else {
87    init();
88  }
89})();

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.