2017-03-05 1 views
0

Ich verwende einen rekursiven Rückruf mit der Funktion animate() jquery. Allerdings stürzt die Seite jedes Mal von Anfang an ab.Warum verursacht mein jquery animate() Callback einen Überlauf? Rekursion

var goingDown = true; 

function animateChevron() { 
     if (goingDown) { 
      goingDown = !goingDown; 
      $('#chevron').animate({'opacity': 1}, 500, animateChevron); 
     } 
     else { 
      goingDown = !goingDown; 
      $('#chevron').animate({'opacity': 0.1}, 500, animateChevron); 
     } 
} 

$(document).ready(function(){ 
    animateChevron(); 
}); 

Danke

EDIT: Ich habe es in einer Schleife handeln wollen: die Sparren erscheint, verschwindet dann, dann wieder usw. erscheint Solange der Benutzer auf der Seite ist.

+0

'animateChevron' wird in beiden Bedingungen aufgerufen - natürlich geht es in eine Endlosschleife. Was willst du erreichen? –

+0

Ich möchte genau diese Animation eine infinite Schleife sein, solange der Benutzer auf der Seite ist. So erscheint der Chevron, dann verschwindet er, dann erscheint er usw. –

Antwort

1

Bitte versuchen Sie diese

$(document).ready(function(){ 
 
\t var speed=500; //in micro seconds 
 
\t setInterval(function(){ 
 
\t \t 
 
    var opacity=$('#chevron').css('opacity')<1 ? 1 : .1; 
 
\t \t $('#chevron').animate({'opacity':opacity},speed); 
 
    
 
\t },speed); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="chevron">Chevron</div>

0

Ihr Code rekursiv unendlich.

habe ich es einen Parameter goingDown, hinzuzufügen, die, wenn sie wahr wird die Animation veranlassen, die zickzack, und stellen Sie den Zustand einer globalen Variablen down passen goingDown zu verstecken. Ich habe die Rekursion entfernt, du brauchst sie nicht.

var downState = null; 
 

 
function animateChevron(goingDown) { 
 
    if (!goingDown) { 
 
     $('#chevron').animate({ 
 
     'opacity': 1 
 
    }, 500); 
 
    } else { 
 
    $('#chevron').animate({ 
 
     'opacity': 0.1 
 
    }, 500); 
 
    } 
 
    downState = goingDown; 
 
} 
 

 
$(document).ready(function() { 
 
    animateChevron(true); 
 
});
#chevron { 
 
font-size: 28px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div id="chevron"> 
 
&raquo; 
 
</div>

+0

Tatsache ist, dass ich möchte, dass er als Schleife funktioniert, unendlich.Der Chevron erscheint, verschwindet dann und erscheint dann wieder. –

+0

Rufen Sie ihn innerhalb eines Intervalls auf - verwenden Sie setInterval und schalten Sie den Status um, der im Parameter übergeben wurde. Oder verwenden Sie eine .gif. – user2182349

1

Versuchen Sie, diese

$('#chevron').animate({'opacity': 1}, { 
    duration: 500, 
    complete: animateChevron 
}); 

Auch können Sie dies besser machen

function animateChevron() {  
$('#chevron').animate({'opacity': 1}, { 
    duration: 500   
}).animate({'opacity': 0.1}, { 
    duration: 500, 
    complete: animateChevron  
});   
} 
0

Hier ist eine andere Lösung ist aufgrund der Lösung, die ich zuerst angeboten (kann immer noch sein, (am Ende dieser Antwort gefunden) nicht den Bedürfnissen der a Skier.

Entsprechend der folgenden Frage verursachen Async-Callbacks keine Stapelüberläufe.

Will recursively calling a function from a callback cause a stack overflow?

(function animateChevron() { 
 
    // Chevron visible at this point 
 
    $('#chevron').animate({'opacity': 0}, 500,() => { 
 
    // Chevron invisible at this point 
 
    $('#chevron').animate({'opacity': 1}, 500, animateChevron); 
 
    }); 
 
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="chevron">Chevron</div>


fand ich eine sehr saubere Lösung direkt hier bei Stackoverflow als Alternative.

How to make blinking/flashing text with css3?

-Code-Schnipsel von Mr. Alien:

(function blink() { 
 
    $('#chevron').fadeOut(500).fadeIn(500, blink); 
 
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="chevron">Chevron</div>

+0

Danke, aber ich plane, es auch in einer Schleife zu bewegen –

+0

Ich habe gerade meine Antwort mit einem anderen Ansatz aktualisiert. Ich bin mir nicht sicher, was Sie innerhalb der Schleife tun müssen. Ist '.animate()' genug? Wenn dies der Fall ist, könnte der aktualisierte Ansatz hilfreich sein. –

Verwandte Themen