J'ai essayé d'écrire ma propre fonction d'animation pour animer le comptage vers le haut et vers le bas d'un nombre en utilisant des boucles et la fonction setInterval
fonction. Dans Chrome, elle semble fonctionner très bien, mais dans Firefox, elle semble lente et prend beaucoup plus de temps que le temps d'exécution prescrit.
Je suppose que la différence réside dans la capacité des deux navigateurs à exécuter Javascript rapidement, mais après avoir rencontré ce problème, j'étais plus curieux qu'autre chose de savoir comment jQuery est capable d'être si cohérent sur le timing, puisqu'il n'utilise apparemment pas le processus que je pensais.
Edit : Voici mon code puisqu'il a été demandé :
function tallyPrices(){
var current_total = parseFloat( $('.budget span').text() );
var new_total = 0;
var animation_options = {
iterationTime : 10,
totalTime : 500
}
$('#chosen-items li').each( function(){
if( $(this).attr('data_price') !== 'n/a' ){
new_total += parseFloat( $(this).attr('data_price') );
}
});
animation_options.difference = current_total - new_total;
animation_options.delta = Math.round( Math.abs( animation_options.difference / ( animation_options.totalTime / animation_options.iterationTime ) ) * 100 ) / 100;
var timesIterated = 0;
var limit = parseFloat( $('.budget span').attr('data_high') );
var animation = setInterval( function(){
timesIterated = priceAnimate( timesIterated, animation_options, $('.budget span'), limit);
if(timesIterated === 'done'){
clearInterval(animation);
$('.budget span').text( parseFloat( Math.round( new_total * 100 ) / 100 ).toFixed(2) );
}
}, animation_options.iterationTime );
}
function priceAnimate( count, options, el, limit ){
if( count < ( options.totalTime / options.iterationTime ) && options.difference !== 0){
var current = parseFloat( el.text() );
current = Math.round( current * 100 ) / 100;
if( options.difference < 0 ){
el.text( parseFloat( Math.round( (current + options.delta) * 100 ) / 100 ).toFixed(2) );
} else if( options.difference > 0 ){
el.text( parseFloat( Math.round( (current - options.delta) * 100 ) / 100 ).toFixed(2) );
}
if( parseFloat( el.text() ) > limit ){
el.parent().addClass('over');
} else {
el.parent().removeClass('over');
}
count++;
return count;
} else {
return 'done';
}
}