jQuery - 获取长度并根据长度以增量触发单击

时间:2014-09-26 22:32:55

标签: javascript jquery

对不起,如果我完全错过了标题,我不完全确定如何说出我想要实现的目标。任何帮助都会很棒!!

在过去的几个月里,在我的空闲时间里,我一直在设置自己的任务来帮助自己理解和学习javascript / jQuery。到目前为止一切进展顺利,但我在路上遇到了一些冲击!

基本上我创建的是一组非常简单的标签内容,其中包含不断变化的横幅。单击选项卡时,相关横幅将淡入,前一个横幅淡出

这是一个小提琴:http://jsfiddle.net/unn9s4yf/

所以我想做的事情和我陷入困境的地方是我希望横幅自动“旋转”,每隔10秒左右以标签顺序淡入和淡出。

有点像触发点击,但我觉得这样做是错误的方式?

$('.thumb' + idAttr).trigger("click");

附加超时?我不确定?我也不确定如何每次都增加它,所以如果这是选择的方法,它将如何从拇指1开始,然后点击2,3,4和...等等?

我使用

获得了div内的拇指数量
var thumbCount = $('#thumbs a').length;

返回15是正确的。所以我猜它会像idAttr = .length从1开始重新开始?

当我将鼠标悬停在主横幅或缩略图上时,我也希望能够暂停“自动点击”功能,我不知道这是否可以实现?

我知道我在这里问了很多......至少我想我是。但是,对此任何部分的任何帮助或指导都将受到广泛赞赏。

感谢您的时间!

3 个答案:

答案 0 :(得分:0)

触发超时点击应该可以正常工作。如果你不想让它结束,你甚至可以递归地做。此外,您可以设置变量以决定何时停止旋转

$(function() {
    $('.thumb').click(function(event, isAutoClick){
        //Is Not automatic click, set false
        if (!isAutoClick) isRotationActive = false;

        //Other Click Code
    });

    //If hover over banner, stop rotation
    $("#banner").on("mouseover", function() {
        isRotationActive = false;
    });

    rotate($(".thumb"), 0);
});

var isRotationActive = true;

function rotate($clickables, currentIndex) {

    //Make sure currentIndex is valid
    currentIndex = currentIndex % $clickables.length;

    //Trigger current click
    $clickables.eq(currentIndex).trigger("click", [true]); //Passes [true] for isAutoClick

    //Call again in 1 second with the next index
    setTimeout(function() { 
        isRotationActive && rotate($clickables, currentIndex + 1) 
    }, 1000);
}

此处更新了小提琴:http://jsfiddle.net/unn9s4yf/3/

答案 1 :(得分:0)

附加解决方案:

var thumbs = $('.thumb');
var currentThumb = 0;
var changingStopped = false;

var changeBanner = function() {
    console.log(thumbs.eq(currentThumb));
    thumbs.eq(currentThumb).click();
    currentThumb >= thumbCount - 1 ? currentThumb = 0 : currentThumb++;
    setTimeout(function() {
        checkIfChange();
    }, 1000);
}
// triggers 'changeBanner()' if the user isn't currently stopping it.
var checkIfChange = function() {
    if (!changingStopped)
    {
        changeBanner();
    }
}

// makes the rotation stop
$('.thumb').mouseenter(function() {
    changingStopped = true;
    $(this).trigger('click'); // Assuming you want the hovered-over thumb to be displayed in the banner.
    currentThumb = $(this).index() + 1; // Additional Option to make the rotation begin again from the current thumb.
});

// makes the rotation start again
$('.thumb').mouseleave(function() {
    changingStopped = false;
    checkIfChange();
});

checkIfChange();

JSFiddle。干杯!

答案 2 :(得分:0)

我分叉你的jsfiddle,并试着做你所要求的。

http://jsfiddle.net/OxyDesign/2g5Lav12/

每3秒更换一次,在最后一个拇指后回到第一个拇指,在mouseenter&在mouseleave上播放(在拇指和横幅上),然后停在click&在同一个拇指上播放第二个click

HTML

<div id="container">

    <div id="thumbs">
        <a class="thumb active"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
        <a class="thumb"></a>
    </div>

    <div id="banner">
        <div class="banner active"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
        <div class="banner"></div>
    </div>

</div>

CSS

#container {width: 960px; margin: 0 auto;}
div,
a {float: left; display: block;}

#thumbs {width: 600px;}
.thumb {width: 110px; height: 156px; margin: 0 10px 10px 0; cursor: pointer;}
.thumb:hover,
.thumb.active,
.thumb.clicked {opacity: 0.5;}

.thumb:nth-child(even) {background: #ccee44;}
.thumb:nth-child(odd) {background: #ff33dd;}

#banner {width: 360px;}
.banner {width: 360px; height: 488px; position: absolute; display: none;}
.banner.active {display: block;}

.banner:nth-child(even) {background: #ccee44;}
.banner:nth-child(odd) {background: #ff33dd;}

JS

$(document).ready(function() {
    var thumbs = $('.thumb'),
        firstThumb = thumbs.eq(0),
        banners = $('.banner'),
        all = thumbs.add(banners),
        duration = 3000,
        rotating = false,
        intervalRotate;

    function setAutoRotate(){
       intervalRotate = setInterval(autoRotate,duration);
       rotating = true;
    }

    function stopAutoRotate(){
       clearInterval(intervalRotate);
       rotating = false;
    }

    function autoRotate(){
        var nextThumb = thumbs.filter('.active').next();
        if(!nextThumb.length) nextThumb = firstThumb;
        rotate(nextThumb);
    }

    function rotate(activeThumb){
        thumbs.removeClass('active');
        activeThumb.addClass('active');
        banners.removeClass('active').eq(thumbs.index(activeThumb)).addClass('active');
    }

    thumbs.on('click',function(e){
        e.preventDefault();
        var thumb = $(this);
        if(thumb.hasClass('clicked')){
            thumb.removeClass('clicked');
        }else{
            stopAutoRotate();
            thumbs.removeClass('clicked');
            thumb.addClass('clicked');
            rotate(thumb);
        }
    });

    all.on('mouseenter',function(){
        if(rotating) stopAutoRotate();
    });

    all.on('mouseleave',function(){
        if(!thumbs.filter('.clicked').length) setAutoRotate();
    });

    setAutoRotate();

}); 

这是你想要的行为吗?