J'ai construit une fonctionnalité lightbox en JavaScript, et je travaille maintenant pour que l'implémentation fonctionne en ayant plusieurs galeries sur la même page, une fonctionnalité que je n'ai pas prise en compte lors de son développement.Premier clic sur la visionneuse fonctionne, mais pas d'autres galeries
Pour obtenir l'effet désiré, j'utilise ensemble de données et les données - * - attributs largement (data-index
à l'index, data-total
pour stocker le nombre d'images dans la .gallery
et data-current
pour stocker .gallery
qui doit être affiché dans le #lightbox
. le .gallery
avec vignette <img>
s sont enveloppées dans <figure><a>
avec un attribut href
au plus #lightbox img
.
Ces attributs fonctionnent théoriquement, et renvoient les valeurs correctes avec le code d'accompagnement. une fois le chargement de la page, en cliquant sur l'une des galeries, la galerie fonctionne comme prévu, bein g isolé des autres, en boucle à travers les images de la galerie.
Le problème survient lors de la fermeture de la visionneuse, et en cliquant sur l'une des autres galeries. Dans IE 11, j'obtiens une erreur Unable to get value of...
dans les outils de développement sur la dernière ligne document.querySelector
. Lors de la sortie des valeurs renvoyées à console.log()
, cependant, je ne comprends pas pourquoi il n'ajoute pas la classe .current
utilisée pour afficher le, car lorsque les valeurs sont correctes et ressemble à un sélecteur valide (et cela fonctionne toujours dans le premier-cliqué) .gallery
):
Ceci est une version très raccourcie du code JS. Les variables et les sélecteurs ont également été traduits en anglais afin que les gens d'ici puissent mieux le comprendre. Jetez un bon coup d'oeil aux variables galleryindex
, galleryindexarray
, thisgallery
, thisgallerya
et current
, où se trouve la fonctionnalité autour du problème.
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");
});
}
Voici une test demo site with further visual clarification. Aidez-moi s'il vous plaît sur cette erreur plutôt petite si vous savez n'importe quoi qui pourrait aider.
Comme vous pouvez le voir sur l'image, [dans le code complet] (http://dd.no/lysboks.js) et probablement dans votre propre console [sur le site de démonstration] (http://dd.no/lightboxtest), ils sont déjà connectés. Quant à jQuery, je sais que c'est plus facile à écrire, mais je l'ai abandonné pour un code plus rapide et plus pur. – mnsth
Désolé, je suis sur mobile - Je vois que vous l'avez enregistré. J'ai même lu le norvégien :) – mplungjan
Ouais, c'est norvégien, comment le savais-tu? :) et pourriez-vous s'il vous plaît m'aider avec cela si vous avez des connaissances? – mnsth