在不同时间 javascript 的 div 中循环 class

loop class in divs with different time javascript

我需要更改 class 当前元素,循环但时间不同。

在这种情况下它只发生一次:/

有什么建议吗?

<div class="wrapper">
    <div class="wrapper-item wrapper-item--0 current" data-time="2500">
        <div class="item"></div>
    </div>
    <div class="wrapper-item wrapper-item--1" data-time="5000">
        <div class="item"></div>
    </div>
    <div class="wrapper-item wrapper-item--0" data-time="7000">
        <div class="item"></div>
    </div>
    <div class="wrapper-item wrapper-item--0" data-time="9000">
        <div class="item"></div>
    </div>
</div>


function myFunction() {
    var current = $('.wrapper').children(".current") 
    var timeOfVisible = $('.wrapper').children(".current").data("time");
    setInterval(function() {
        current.removeClass("current").next().addClass("current");
        if ((current.next()) > $('.wrapper').children().length) {
            alert(current)
        }
    }, timeOfVisible);
}
myFunction()

如果要链接函数,则需要将主函数循环添加到 setInterval 的回调中。

简单的做法是:

function myFunction() {
    var current = $('.wrapper').children(".current") 
    var timeOfVisible = $('.wrapper').children(".current").data("time");
    setInterval(function() {
        current.removeClass("current").next().addClass("current");
        if ((current.next()) > $('.wrapper').children().length) {
            alert(current)
        }
        myFunction();
    }, timeOfVisible);
}

我所做的只是将函数调用 myFunction() 移动到回调内部。

你可以通过调用函数 两次 次而不是一次来解决。并递归地调用它,即在它自身内部调用它

您可以查看控制台....

这是一个工作片段

$(document).ready(function(){ 
 function myFunction() {
   
    var current = $('.wrapper').children(".current"); 
    var timeOfVisible = $('.wrapper').children(".current").data("time");
  
    setInterval(function() {
        current.removeClass("current").next().addClass("current");
  console.log($(current))
        if ((current.next()) > $('.wrapper').children().length) {
            alert(current)
        }
  myFunction()
    }, timeOfVisible);
}
myFunction();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>



<div class="wrapper">
    <div class="wrapper-item wrapper-item--0 current" data-time="2500">
        <div class="item">0</div>
    </div>
    <div class="wrapper-item wrapper-item--1" data-time="5000">
        <div class="item">1</div>
    </div>
    <div class="wrapper-item wrapper-item--0" data-time="7000">
        <div class="item">2</div>
    </div>
    <div class="wrapper-item wrapper-item--0" data-time="9000">
        <div class="item">3</div>
    </div>
</div>

首先,您将需要 setTimeout 而不是 Interval,因为您将 运行 每个元素延迟一次。其次 - 你需要递归地调用你的函数才能在循环中重复。 这是为你工作的 js:

function changeClass() {
  var current = $('.wrapper .wrapper-item.current');
  if(current.length > 0) {
     var timeOfVisible = current.data("time");
     setTimeout(function(){
    current.removeClass('current');
    if (current.next().length > 0)
        current.next().addClass('current');
    else
      $('.wrapper .wrapper-item').first().addClass('current');
      changeClass();
  }, timeOfVisible); 
  }
};

changeClass();

Codepen 示例 here.

此外,如果您不想无限循环,请改用此方法:

function changeClass() {
  var current = $('.wrapper .wrapper-item.current');
  if(current.length > 0) {
     var timeOfVisible = current.data("time");
     setTimeout(function(){
    current.removeClass('current');
    if (current.next().length > 0) {
      current.next().addClass('current');
      changeClass(); 
    }
  }, timeOfVisible); 
  }
};

changeClass();