2016-11-30 2 views
0

mein Zweck ist es, die ersten 3 Folien x Anzahl der Male zu zeigen und dann die nächsten 3 Folien x Anzahl der Male, danach werden die ersten 3 Folien wieder angezeigt werden, alles wird Looper. Wie kann ich das tun?Loop-Funktionen mit setInterval() nacheinander

Hier ist der Code hat ich schon, aber ich stecke, wenn ich auf "Neustart" alles brauche:

Beispiel von HTML:

<div class="contents"> 
<div class="transit"> 
    <div class="content ctransit_" id="ct_1" > 
     <div class="main_transit" >  <h1>1.1slide</h1> </div> 
    </div> 
    <div class="content ctransit_" id="ct_2" > 
     <div class="main_transit"> <h1>1.2slide</h1> </div> 
    </div> 
    <div class="content ctransit_" id="ct_3" > 
     <div class="main_transit"> <h1>1.1slide</h1> 
    </div> 
</div> 
<div class="arrived"> 
    <div class="content carrived_ " id="ct_1" > 
     <div class="main_arrived"> <h1>2.1slide</h1> </div> 
    </div> 
    <div class="content carrived_" id="ct_2" > 
     <div class="main_arrived"> <h1>2.2slide</h1> </div> 
    </div> 
    <div class="content carrived_" id="ct_3"> 

     <div class="main_arrived"> <h1>2.3slide</h1></div> 
    </div> 
</div> 
</div> 

JS:

var c=0; 
var k=0; 

function setIntervalX(interationFunction, delay, repetitions, callbackFunction) { 
var x = 0; 
var intervalID = window.setInterval(function() { 

    interationFunction(); 

    if (++x === repetitions) { 
     callbackFunction(); 
     window.clearInterval(intervalID); 
    } 
}, delay);} 


$(".carrived_").hide(); 
    $(".ctransit_").not(":first").hide(); 

    setIntervalX(
    function() { 
    $(".ctransit_:gt(0)").hide(); 
     $('.ctransit_:first') 
       .slideUp(1000) 
       .next().addClass(inClass) 
       .slideDown(1500) 
       .end().addClass(outClass) 
       .appendTo('.contents .transit '); 

     console.log(c++) // this executed every time the interval triggers 
    },3000, 5, 
    function() {  
     $(".transit").hide(); 
     $(".ctransit_").hide(); 

     $(".carrived_:first").show().addClass(inClass) 
      $(".carrived_").not(":first").hide(); 


      var x = 0; 

     var intervalID = window.setInterval(function() { 

     $(".carrived_:gt(0)").hide(); 
     $('.carrived_:first') 
     .slideUp(1000) 
     .next().addClass(inClass) 
     .slideDown(1500) 
     .end().addClass(outClass) 
     .appendTo('.contents .arrived '); 
         if (++x === 5) { 
          window.clearInterval(intervalID); 
         } 
     console.log(x) 
     }, 3000); 
// this will be executed after the interval triggered 5 times 
// so after round about 5 seconds after setIntervalX was started 
} 

https://jsfiddle.net/kqLkLwrk/4/

+0

Diese übermäßig kompliziert zu sein scheint. Habe einen einzigen 'Handler' Aufruf über 'setInterval', der weiß, welcher Satz von Slides angezeigt werden soll (auf der Basisebene über eine globale Variable, oder über einen Attr oder über ein Plugin local var) –

Antwort

0

Mein Favorit ist eine Funktion, die durch Loop umgehen kann, setzen Sie Parameter ne In ein Array übertragen und dann den Index durchlaufen. Hier gehen wir:

function showSlide(arr,index){ 
    if(arr.length==0) return; 
    if(index>=arr.length) index=0; 
    var cur = arr[index]; 
    var target = cur[0]; 
    var container = cur[1]; 
    var delay = cur[2]; 
    var rep = cur[3]; 

    $(".ctransit_").hide(); 
    $(".carrived_").hide(); 
    $(target).first().show(); 
    setIntervalX(function() { 
     $(target).not(":first").hide(); 
     $(target).first().show() 
      .slideUp(1000) 
      .next().addClass(inClass) 
      .slideDown(1500) 
      .end().addClass(outClass) 
      .appendTo(container); 

     console.log(c++) 
     // this executed every time the interval triggers 
    },delay,rep, function(){ 
     index++; 
     showSlide(arr,index); 
    }); 
} 

showSlide([ 
    [".ctransit_",'.contents .transit',3000,6], 
    [".carrived_",'.contents .arrived',3000,5] 
],0); 

https://jsfiddle.net/kqLkLwrk/4/

+0

Danke, es funktioniert :) –