简体   繁体   English

如何摆脱轮播中的未定义索引

[英]How to Get Rid of Undefined Index in Carousel

I am working on developing an image carousel that looks something like the following: 我正在开发看起来像以下内容的图像轮播:

在此处输入图片说明

I will go through and style everything correctly once I have all of the JavaScript and JQuery functioning properly so it won't display 100% like the picture below at it's present stage so don't worry about that. 一旦所有JavaScript和JQuery均正常运行,我将仔细检查所有样式并设置样式,因此在现阶段它不会像下面的图片那样显示100%,所以不必担心。 My current issue is that one of the smaller thumbnails is showing up as "undefined" under the img with id img3 and another under img1 when you click through the carousel. 我当前的问题是,单击轮播时,较小的缩略图之一在ID为img3的img下显示为“未定义”,而在img1下显示为“未定义”。 I know that the issue is from my index trying to call something at the end or at the beginning of my array that doesn't exist. 我知道问题出在我的索引上,试图在数组的结尾或开头调用不存在的东西。 How do I fix this in my JavaScript so that the first index in the array shows up rather than an index that doesn't exist? 如何在JavaScript中解决此问题,以便显示数组中的第一个索引而不是不存在的索引?

I stripped out the irrelevant code below so you can see what I have so far: 我删除了下面不相关的代码,因此您可以看到到目前为止的内容:

HTML 的HTML

<div id="carouselContainer">
<!--Add carousel and lightbox "view larger" button here-->
<img id="productImage" src="#">
<div id="viewLarger"></div>
<div id="carouselWrapper">
    <button id="prev">Prev</button>
    <div id="carousel">
        <img id="img1" src="#">
        <img id="img2" src="#">
        <img id="img3" src="#">
    </div>
    <button id="next">Next</button>
</div>
</div>

JavaScript 的JavaScript

$.getJSON("item-data.json", function(results) {
        $.each(results.CatalogEntryView, function(index, item) {

            document.getElementById("productImage").src = item.Images[0].PrimaryImage[0].image;
            document.getElementById("img1").src = item.Images[0].AlternateImages[0].image;
            document.getElementById("img2").src = item.Images[0].AlternateImages[1].image;
            document.getElementById("img3").src = item.Images[0].AlternateImages[2].image;

        });

        //Map Array for Slideshow
     var slideShowArray = results.CatalogEntryView.map(item => item.Images.map(imgs =>[imgs.PrimaryImage[0].image, ...imgs.AlternateImages.map(alt => alt.image)]))[0][0];

        //Slideshow functions
            var num = 0
            function next() {
                var slider = document.getElementById("productImage");
                var carouselImg1 = document.getElementById("img1");
                var carouselImg2 = document.getElementById("img2");
                var carouselImg3 = document.getElementById("img3");
                num++
                if(num >= slideShowArray.length)
                    {num = 0}
                            productImage.src = slideShowArray[num];
                            img1.src = slideShowArray[num-1];
                            img2.src = slideShowArray[num];
                            img3.src = slideShowArray[num+1];
            }

            function prev() {
                var slider = document.getElementById("productImage");
                var carouselImg1 = document.getElementById("img1");
                var carouselImg2 = document.getElementById("img2");
                var carouselImg3 = document.getElementById("img3");
                num--;
                if(num < 0) {
                    num = slideShowArray.length-1;
                }
                productImage.src = slideShowArray[num];
                        img1.src = slideShowArray[num-1];
                        img2.src = slideShowArray[num];
                        img3.src = slideShowArray[num+1];
            }

        //Event Listeners
            document.getElementById("next").addEventListener("click", next)
            document.getElementById("prev").addEventListener("click", prev)

            });

CSS Placeholder Code to Shrink the Thumbnails CSS占位符代码以缩小缩略图

#img1, #img2, #img3 {
    height: 50px;
    width: 50px;
}

JSON JSON格式

This fiddle will show you the relevant JSON data in item-data.json : https://jsfiddle.net/kdd1gppz/ 该小提琴将在item-data.json向您显示相关的JSON数据: https : item-data.json

if(num >= slideShowArray.length)
                {num = 0}
productImage.src = slideShowArray[num];
img1.src = slideShowArray[num-1];
img2.src = slideShowArray[num];
img3.src = slideShowArray[num+1];

And

if(num < 0) {
    num = slideShowArray.length-1;
}
productImage.src = slideShowArray[num];
img1.src = slideShowArray[num-1];
img2.src = slideShowArray[num];
img3.src = slideShowArray[num+1];

Problems are here. 问题在这里。 When n = 0, you try to read slideShowArray[-1] and when n = slideShowArray.length - 1, you try to read slideShowArray[slideShowArray.length] . 当n = 0时,您尝试读取slideShowArray[-1] ;当n = slideShowArray.length-1时,尝试读取slideShowArray[slideShowArray.length] Both doesn't exit, this is why you get undefined values. 两者都不会退出,这就是为什么您获得未定义的值的原因。 You have to bound num value between [0; slideShowArray.length - 1] 您必须将num值限制在[0; slideShowArray.length - 1] [0; slideShowArray.length - 1] (ie : if n = -1 => n = slideShowArray.length - 1, if n = slideShowArray.length => n = 0) [0; slideShowArray.length - 1] (即:如果n = -1 => n = slideShowArray.length-1,如果n = slideShowArray.length => n = 0)

Modulo operator should help you 模运算符应为您提供帮助

[Solution] [解]

Add a function : 添加功能:

function getIndex(num, offset, arrayLength) {
    // Add arrayLength prevents negative number test case
    return (num + arrayLength + offset) % arrayLength;
}

Remove your if statements. 删除您的if语句。

When you do num++ / num-- , replace by num = getIndex(num, +/-1, slideShowArray.length) 当您执行num++ / num-- ,替换为num = getIndex(num, +/-1, slideShowArray.length)

When you tried to access to slideShowArray , replace direct access by slideShowArray[getIndex(num, +/-1, slideShowArray.length)] 当您尝试访问slideShowArray ,将直接访问权限替换为slideShowArray[getIndex(num, +/-1, slideShowArray.length)]

The only strong limitation is to not start num to a negative value < slideShowArray.length 唯一的强项限制是不将num开头为负值< slideShowArray.length

This worked. 这工作了。 Created variables stepup and step down: 创建的变量逐步递增和递减:

            var num = 0
            function next() {
                var slider = document.getElementById("productImage");
                var carouselImg1 = document.getElementById("img1");
                var carouselImg2 = document.getElementById("img2");
                var carouselImg3 = document.getElementById("img3");
//
                num++
                if(num >= slideShowArray.length)
                    {num = 0}

                var stepup = num + 1;
                var stepdown = num -1;

                if(stepup >= slideShowArray.length)
                    {stepup = 0}
                if(stepdown < 0)
                    {stepdown = slideShowArray.length-1}

                            productImage.src = slideShowArray[num];
                            img1.src = slideShowArray[stepdown];
                            img2.src = slideShowArray[num];
                            img3.src = slideShowArray[stepup];

            }

            function prev() {
                var slider = document.getElementById("productImage");
                var carouselImg1 = document.getElementById("img1");
                var carouselImg2 = document.getElementById("img2");
                var carouselImg3 = document.getElementById("img3");
                //
                num--;
                if(num < 0) {
                    num = slideShowArray.length-1;
                }

                var stepup = num + 1;
                var stepdown = num -1;

                if(stepup >= slideShowArray.length)
                    {stepup = 0}
                if(stepdown < 0)
                    {stepdown = slideShowArray.length-1}

                productImage.src = slideShowArray[num];
                        img1.src = slideShowArray[stepdown];
                        img2.src = slideShowArray[num];
                        img3.src = slideShowArray[stepup];

            }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM