使用数组和 for 循环的 JavaScript 轮播:为什么 slideIndex 在第一次循环后会“卡住”?
2017-09-10
494
我正在尝试使用数组和 for 循环创建一个不使用 jQuery 的 javascript 图像轮播。
在 4 个对象的图像数组的末尾,“下一个按钮”返回到 array[slideIndex=0]。
类似地,当您点击数组中第一个对象上的“上一个按钮”时,它会返回数组中的最后一个对象。
这个函数似乎 几乎 可以与我现在拥有的代码一起使用。但是,它只能工作一次。在向后或向前跳到数组中的最后一个或第一个对象后,它不会继续按预期方向滚动。
您能告诉我为什么
slideIndex
在第一次跳过后没有继续使用
plusDivs()
函数进行循环吗?
let slides_array = document.getElementsByClassName("mySlides");
let slideIndex = 0;
showDivs(slideIndex);
function plusDivs(n) {
slideIndex += n;
showDivs(slideIndex);
}
function showDivs(slideIndex) {
let i;
if (slideIndex > (slides_array.length - 1)) {
slideIndex = 0;
};
if (slideIndex < 0) {
slideIndex = (slides_array.length - 1);
};
for (i=0; i<(slides_array.length); i++) {
slides_array[i].style.display = "none";
}
slides_array[slideIndex].style.display = "block";
}
<section class = "Slideshow">
<div id="slide1" class="mySlides">
<img src="http://cdn3-www.dogtime.com/assets/uploads/gallery/goldador-dog-breed-pictures/puppy-1.jpg">
</div>
<div id="slide2" class="mySlides">
<img src="https://www.cesarsway.com/sites/newcesarsway/files/styles/large_article_preview/public/Shake-shiver-and-tremble-Why-dogs-do-it.jpg?itok=yvOUgQeL">
</div>
<div id="slide3" class="mySlides">
<img src="https://i.kinja-img.com/gawker-media/image/upload/s--kx3d-Wgg--/c_scale,fl_progressive,q_80,w_800/ol9ceoqxidudap8owlwn.jpg">
</div>
<div id="slide4" class="mySlides">
<img src="http://cdn1-www.dogtime.com/assets/uploads/gallery/korean-jindo-dog-breed-pictures/puppy-1_680-453.jpg">
</div>
</section>
<!-- Slideshow Buttons -->
<button class="button" onclick="plusDivs(-1)"> ❮ </button>
<button class="button" onclick="plusDivs(+1)"> ❯ </button>
如果我没有使用正确的技术术语,请原谅(并纠正)我——我正在尽我所能描述我当前的问题,但这可能不是描述问题的最佳方式。请指教。
2个回答
由于您有一个全局变量
slideIndex
,因此您不应将其作为函数参数传递,因为这会创建一个具有相同名称的局部变量,但对它的任何重新分配都不会影响全局变量。
let slides_array = document.getElementsByClassName("mySlides");
let slideIndex = 0;
showDivs(slideIndex);
function plusDivs(n) {
slideIndex += n;
showDivs(); /// <----
}
function showDivs() { /// <----
let i;
if (slideIndex > (slides_array.length - 1)) {
slideIndex = 0;
};
if (slideIndex < 0) {
slideIndex = (slides_array.length - 1);
};
for (i=0; i<(slides_array.length); i++) {
slides_array[i].style.display = "none";
}
slides_array[slideIndex].style.display = "block";
}
<section class = "Slideshow">
<div id="slide1" class="mySlides">
<img src="http://cdn3-www.dogtime.com/assets/uploads/gallery/goldador-dog-breed-pictures/puppy-1.jpg">
</div>
<div id="slide2" class="mySlides">
<img src="https://www.cesarsway.com/sites/newcesarsway/files/styles/large_article_preview/public/Shake-shiver-and-tremble-Why-dogs-do-it.jpg?itok=yvOUgQeL">
</div>
<div id="slide3" class="mySlides">
<img src="https://i.kinja-img.com/gawker-media/image/upload/s--kx3d-Wgg--/c_scale,fl_progressive,q_80,w_800/ol9ceoqxidudap8owlwn.jpg">
</div>
<div id="slide4" class="mySlides">
<img src="http://cdn1-www.dogtime.com/assets/uploads/gallery/korean-jindo-dog-breed-pictures/puppy-1_680-453.jpg">
</div>
</section>
<!-- Slideshow Buttons -->
<button class="button" onclick="plusDivs(-1)"> ❮ </button>
<button class="button" onclick="plusDivs(+1)"> ❯ </button>
或者,您可以将其作为参数传递,但请确保对全局变量进行修改(在传递参数的函数之外)。
trincot
2017-09-10
Duj 和 Trincot 提到的范围问题是这里的关键问题。将
slideIndex
的重置移出
showDivs
解决了这个问题。
创建更自解释的代码的一种方法是将
plusDivs
更改为两个函数,一个增加(
plusDivs
),另一个减少(
minusDivs
)。然后您可以在其中更新
slideIndex
。
(这两个函数使用
三元运算符
来更新
slideIndex
,这非常酷,而且易于实现)。
let slides_array = document.getElementsByClassName("mySlides");
let slideIndex = 0;
showDivs(slideIndex);
function plusDivs() {
slideIndex = slideIndex === slides_array.length - 1 ? 0 : slideIndex + 1;
showDivs(slideIndex);
}
function minusDivs() {
slideIndex = slideIndex === 0 ? slides_array.length - 1 : slideIndex - 1;
showDivs(slideIndex);
}
function showDivs(slideIndex) {
for (i = 0; i < slides_array.length; i++) {
slides_array[i].style.display = "none";
}
slides_array[slideIndex].style.display = "block";
}
然后您可以像这样更新 HTML:
<!-- Slideshow Buttons -->
<button class="button" onclick="minusDivs()"> ❮ </button>
<button class="button" onclick="plusDivs()"> ❯ </button>
andrewatkinson
2017-09-10