Я создал функциональность лайтбокса в JavaScript, и теперь я работаю над тем, чтобы реализация выполнялась при наличии нескольких галерей на той же странице, что я не принимал при его разработке.Первый щелчок на лайтбокс работает, но не из других галерей
Для достижения желаемого эффекта, я использую набор данные и данные - * - атрибуты экстенсивно (data-index
индексировать, data-total
хранить сколько изображения в .gallery
и data-current
для хранения .gallery
, которые должны быть отображены в #lightbox
. .gallery
с пиктограммой <img>
s завернуты в <figure><a>
с href
атрибута, тем больше #lightbox img
.
Эти атрибуты работают теоретически, и возвращать правильные значения с сопровождающими код. После загрузки страницы, при нажатии на одну из галерей, галерея работает, как ожидалось, bein g, изолированный от других, зацикливая изображения галереи.
Проблема возникает при закрытии лайтбокса и нажатии на одну из других галерей. В IE 11 я получаю ошибку Unable to get value of...
в инструментах разработчика на последней строке document.querySelector
. Однако при выводе возвращаемых значений в console.log()
я не могу понять, почему он не добавляет класс .current
, который используется для отображения, потому что когда значения верны и выглядят как допустимый селектор (и он по-прежнему работает в первом щелкнике .gallery
):
Это сильно сокращенный вариант кода JS. Переменные и селекторы также были переведены на английский язык, чтобы люди здесь могли лучше понять это. Внимательно посмотрите на переменные galleryindex
, galleryindexarray
, thisgallery
, thisgallerya
и current
, в которых лежит функциональность вокруг проблемы.
var lightbox = document.createElement('div'),
gallerya = document.querySelectorAll(".gallery a"),
current, img, i, galleryindexarr = [];
for (i = 0; i < gallerya.length; i++) {
gallerya[i].addEventListener("click", function(e) {
e.preventDefault();
var galleryindex = this.parentNode.parentNode.dataset.index,
thisgallery = document.querySelector(".gallery[data-index='" + galleryindex + "']"),
thisgallerya = document.querySelectorAll(".gallery[data-index='" + galleryindex + "'] a");
if(!document.getElementById("lightbox")) {
lightbox.id = "lightbox";
document.body.insertBefore(lightbox, document.body.firstChild);
}
if(galleryindexarr.indexOf(galleryindex) == -1) {
galleryindexarr.push(galleryindex);
for (i = 0; i < thisgallerya.length; i++) {
img = document.createElement("img");
img.src = thisgallerya[i].href;
img.dataset.index = galleryindex;
lightbox.appendChild(img);
}
}
current = [].indexOf.call(thisgallery.childNodes, this.parentNode);
document.querySelector("#lightbox img[data-index='" + galleryindex + "']:nth-of-type(" + current + ")").classList.add("current");
});
}
Адрес test demo site with further visual clarification. Пожалуйста, помогите мне в этой довольно небольшой ошибке, если вы знаете все, что может помочь.
Как вы можете видеть на картинке, [в полном коде] (http://dd.no/lysboks.js) и, возможно, в вашей собственной консоли [на демонстрационном сайте] (http://dd.no/lightboxtest), они уже зарегистрированы. Что касается jQuery, я знаю, что писать легче, но я отказался от него для более быстрого и чистого кода. – mnsth
Извините, я нахожусь на мобильном телефоне - я вижу, вы записали его. Я даже читал норвежский язык :) – mplungjan
Да, это норвежский, как вы узнали? :) и не могли бы вы помочь мне с этим, если у вас есть какие-либо знания? – mnsth