【问题标题】:Slideshow / Carousel not working properly in a specific condition?幻灯片/轮播在特定条件下无法正常工作?
【发布时间】:2021-07-01 07:35:15
【问题描述】:

此 JS 代码无法正常工作。是什么原因?

let indexOfSlide = 1; // update me !
show(indexOfSlide);

function liveSlide(n){
   show(indexOfSlide = n); // update me !
}

function plusSlidesItem(n){
   show(indexOfSlide += n);
}

function show(indexOfSlide) {
    let slides_item = document.getElementsByClassName("slides-item");
    let tiny_img = document.getElementsByClassName("tiny-img");
    let i;
    
    if( indexOfSlide < 1){
        indexOfSlide = slides_item.length;
    }
    if( indexOfSlide > slides_item.length){
        indexOfSlide = 1;
    }

    for(i=0;i<slides_item.length;i++){
        slides_item[i].style.display = "none";
    }

    for(i=0;i< slides_item.length; i++){
        tiny_img[i].style.opacity = "0.5";
    }

    slides_item[indexOfSlide-1].style.display = "initial";
    tiny_img[indexOfSlide-1].style.opacity = "1" ;
}

当 indexOfSlide 在 show() 函数的参数中被 n 替换时,并且在 show() 中的两个 if 语句条件中,它可以正常工作。为什么?

【问题讨论】:

    标签: javascript arguments slideshow


    【解决方案1】:

    这里可以进行一些代码重构。

    let indexOfSlide = 1; // update me !
    
    // we might as well use the global variable indexOfSlide instead of
    // passing it as a parameter since it is updating at each call
    function show() {
        let slides_item = document.getElementsByClassName("slides-item");
        let tiny_img = document.getElementsByClassName("tiny-img");
    
        if( indexOfSlide < 1 ){
            indexOfSlide = slides_item.length;
        } else if( indexOfSlide > slides_item.length ){
            indexOfSlide = 1;
        }
    
        // you can merge both the loops since they are
        // iterating over the same index sequence
        for(let i = 0; i < slides_item.length; i++){
            slides_item[i].style.display = "none";
            tiny_img[i].style.opacity = "0.5";
        }
    
        slides_item[indexOfSlide - 1].style.display = "initial";
        tiny_img[indexOfSlide - 1].style.opacity = "1" ;
    }
    
    // calling the show() function after it has been defined
    // is how it should be done else it'll throw an error
    
    show();
    
    function liveSlide(n){
       indexOfSlide = n;
       show(); // update me !
    }
    
    function plusSlidesItem(n){
       indexOfSlide += n;
       show();
    }
    

    看看能不能解决问题

    【讨论】:

    • 即使我在第二行调用 show() 函数,您的代码也运行良好。我的代码和你的代码只有一个区别,我的 show 函数正在接受参数,而你的没有。解释一下为什么这种差异会产生错误?
    • 因为 show() 中的参数indexOfSlide 是一个局部变量,对局部变量的任何更改都不会影响全局变量,即使它与全局变量同名
    • 所以当您在 show() 函数中更改 indexOfSlide 的值时,全局变量 indexOfSlide 并没有改变
    • 查看example
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多