【问题标题】:Next/prev button for modal with Javascript带有 Javascript 的模态的下一个/上一个按钮
【发布时间】:2021-01-03 17:53:26
【问题描述】:

我一直在尝试为我正在构建的自定义网站制作模式。一切似乎都很顺利。它显示了我单击的任何图片,并且“上一个”按钮按预期工作。但是,“下一步”按钮似乎存在问题,因为它的行为取决于我当前在哪张图片上。有时它会向前甚至向后跳跃几个索引。一些见解将不胜感激。提前致谢。这是一个代码HTML:

<div id="modalcontainer" class="displaynone">
    <h4>
        <span id="close">X</span>
    </h4>
    <img src="" alt="" id="modalcontent">
    <div class="buttoncontainer">
        <div class="previous">
            <span id="prev">&lt;</span>
        </div>
        <div class="next">
            <span id="next">&gt;</span>
        </div>
    </div>
</div>
<div id="imgcontainer">
    <img src="images/1.JPG" alt="">
    <img src="images/2.JPG" alt="">
    <img src="images/3.JPG" alt="">
    <img src="images/4.JPG" alt="">
    <img src="images/8.png" alt="">
    <img src="images/9.jpg" alt="">
    <img src="images/10.jpg" alt="">
</div>

还有 JS:

const modalContainer = document.getElementById("modalcontainer");
const prevButton = document.getElementById("prev");
const nextButton = document.getElementById("next");
const closeModal = document.getElementById("close");
const modalContent = document.getElementById("modalcontent");
const imgContainer = document.getElementById("imgcontainer");
let containerImages = imgContainer.querySelectorAll("img");
let imgIndex = 0;



containerImages.forEach(function(img){
    img.setAttribute("data-index", imgIndex++);
    img.addEventListener("click", () => {
        if(modalContainer.classList.contains("displaynone")){
            modalContainer.classList.remove("displaynone");
            modalContainer.classList.add("displaymodal");
            modalContent.src = img.src;
           
        };
            imgIndex = img.dataset.index;
            console.log(imgIndex);
    });
});

closeModal.addEventListener("click", () => {
    if(modalContainer.classList.contains("displaymodal")){
        modalContainer.classList.remove("displaymodal");
        modalContainer.classList.add("displaynone");
    }
    imgIndex = 0;
});

nextButton.addEventListener("click", () => {
    imgIndex = (imgIndex += 1) % containerImages.length;
    modalContent.src = containerImages[imgIndex].src;
    console.log(imgIndex);
});

prevButton.addEventListener("click", () => {
    imgIndex = (imgIndex -= 1);
    if (imgIndex < 0) {
    imgIndex = containerImages.length - 1;
    console.log(imgIndex);
    };
    modalContent.src = containerImages[imgIndex].src;
    console.log(imgIndex);
});

【问题讨论】:

    标签: javascript dom simplemodal


    【解决方案1】:

    我设置了一些对象以使其运行,并且您的上一个/下一个按钮代码似乎可以正常工作。是否还有其他可能涉及的代码?修改 imageContainer 中的图像数量的东西?

    const prevButton = document.querySelector("#prev");
    const nextButton = document.querySelector("#next");
    let images = document.querySelectorAll("img");
    let imgIndex = 0;
    
    images.forEach((img) =>
      img.addEventListener("click", () => {
        imgIndex = parseInt(img.dataset.index);
        setSelected();
      })
    );
    
    setSelected();
    
    prevButton.addEventListener("click", () => {
      imgIndex = imgIndex -= 1;
      if (imgIndex < 0) imgIndex = images.length - 1;
      setSelected();
    });
    
    nextButton.addEventListener("click", () => {
      imgIndex = (imgIndex += 1) % images.length;
      setSelected();
    });
    
    function setSelected() {
      images.forEach((img) => img.classList.remove("selected"));
      images[imgIndex].classList.add("selected");
    }
    img {
      display: inline-block;
      border: 2px solid transparent;
    }
    
    .selected {
      border: 2px solid red;
    }
    <div id="imageContainer">
      <img src="https://picsum.photos/100?random=1" data-index="0">
      <img src="https://picsum.photos/100?random=2" data-index="1">
      <img src="https://picsum.photos/100?random=3" data-index="2">
      <img src="https://picsum.photos/100?random=4" data-index="3">
    </div>
    <div>
      <button id="prev">Prev</button>
      <button id="next">Next</button>
    </div>

    【讨论】:

    • 感谢您的回答。不,没有别的了。我只是硬编码图像的路径。顺便说一句,我没有提到,“下一步”按钮只有在我点击第一张图片时才能正常工作。例如,如果我点击第三个,然后从那个点击下一步,一切都会搞砸。
    • 我还是很难过。我想了一会儿也许你需要解析数据索引,但这似乎没有必要。
    • 太搞笑了,因为就在你回复之前,我发现由于某种原因 imgIndex 变量将数据索引存储为字符串,所以每当我点击时,它都会返回 1、11、111……你明白了。然后我像你说的那样使用了 parseInt() 函数,它开始按预期工作。奇怪的是,为什么在“下一个”按钮行为被编程的函数中,imgIndex 作为字符串返回,即使在 foreach 循环中我可以增加它没有问题。
    • 啊...是的,我想就是这样。我刚开始在周围设置边框,但我发现它出了问题。
    • parseInt 似乎可以修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多