图片轮播事件,最后一个和第一个总是跳过,无法播放。

        <div class="img_show" id="img_show">
            <a href="#"title="链接1" class="box image show"><img src="./images/img1.jpg" alt=""></a>
            <a href="#"title="链接2" class="box image no"><img src="./images/img1.jpg" alt=""></a>
            <a href="#"title="链接3" class="box image no"><img src="./images/img1.jpg" alt=""></a>
            <a href="#"title="链接4" class="box image no"><img src="./images/img1.jpg" alt=""></a>
            <a href="#"title="链接5" class="box image no"><img src="./images/img1.jpg" alt=""></a>
            <a href="#"title="链接6" class="box image no"><img src="./images/img1.jpg" alt=""></a>
            <span class="left">&#xe948</span><span class="right">&#xe946</span>
        </div>
//   ********以上为HTML代码

//***********以下为JS 代码。
function userCheck(){
    var aList=getClassName("image");
    if(this.className=="left"){
        leftLoop(aList);
    }else if(this.className="right"){
        rightLoop(aList);
    }
}

//  左播放
function leftLoop(list){
    for(var i=0;i<list.length;i++){
        (function(){
            if(list[i].className.indexOf("show")!=-1){
                list[i].className=list[i].className.replace(/show/ig,"no");
                if(i!=0){
                    list[i-1].className=list[i-1].className.replace(/no/ig,"show");
                }else{
                    list[list.length-1].className=list[list.length-1].className.replace(/no/ig,"show");
                }
            }
        })(list,i);
    }
}

// 右播放
function rightLoop(list){
    for(var i=list.length-1;i>=0;i--){
        (function(){
            if(list[i].className.indexOf("show")!=-1){
                list[i].className=list[i].className.replace(/show/ig,"no");
                if(i!=list.length-1){
                    list[i+1].className=list[i+1].className.replace(/no/ig,"show");
                }else{
                    list[0].className=list[0].className.replace(/no/ig,"show");
                }
            }
        })(list,i);
    }
}

在进行鼠标点击时,点击左方向键时,直接从第一个跳到倒数第二个。
如图:
clipboard.png
点击右方向键时,刚好相反,是从最后一个直接到第二个,跳过第一个。
如图:
clipboard.png

阅读 3.8k
2 个回答

以右播放为例,是你下面的循环写错了

// 右播放
function rightLoop(list){
    for(var i=list.length-1;i>=0;i--){
        (function(){
            if(list[i].className.indexOf("show")!=-1){
                list[i].className=list[i].className.replace(/show/ig,"no");
                if(i!=list.length-1){
                    list[i+1].className=list[i+1].className.replace(/no/ig,"show");
                }else{
                    list[0].className=list[0].className.replace(/no/ig,"show");
                }
            }
        })(list,i);
    }
}

原因:有6张图,现在已经显示到第6张了,此时点击,首次i=5,其class为show,进行你的样式替换逻辑是对的,将i=5的图样式改为no,i=0的图样式改为show,但你的循环操作并没有停止,在继续执行,i=4时,其class不是show,没有问题,i=3/2/1也是,但当循环到i=0时,就有问题,因为第一次循环时你已经将i=0改为show了,就又进行了一替换,将i=0改为no,同时i+1改为show,所以就跳过了第一张
left同理
修改:当符合条件了就break,不要再循环就好了,并且你这里用闭包是没有意义的,其没有暂存变量

function rightLoop(list){
    for(var i=list.length-1;i>=0;i--){
        if(list[i].className.indexOf("show")!=-1){
            list[i].className=list[i].className.replace(/show/ig,"no");
            if(i!=list.length-1){
                list[i+1].className=list[i+1].className.replace(/no/ig,"show");
            }else{
                list[0].className=list[0].className.replace(/no/ig,"show");
            }
            break; //增加break,并去掉闭包
        }
    }
}

这样OK

1,错误原因是当在第一个点击左方向键和最后一个点击右方向键时执行了两遍自执行函数,所以会直接跳过一个。
图片描述

2,修改方法:执行左移或右移后不再循环直接跳出来,在里面添加if,else语句中加入break;或者直接通过循环先获取当前展示的图片的index然后执行左移或右边

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题