使用Javascript定期设置数字动画

时间:2010-02-25 16:37:51

标签: javascript jquery increment

我的页面上有一个元素,我想不时增加:

<p class="count">28</p>

在我的javascript中,我有一个每5秒运行一次的间隔,并从服务器异步地抓取新的(更高的)数字。这有点像计数器一样。

setInterval(function(){
  $.post("getcount.php", function(num){
    latestNum = num;
  });
}, 5000);

如果异步请求下拉数字56,我希望看到段落文本从28变为56,显示许多(或大多数)或中间体递增时。我目前正在做的是设置另一个间隔来不断检查段落文本和局部变量。如果段落文本低于变量值,则将其递增1.它每隔半秒执行一次。

setInterval(function(){
  currNum = Number( $(".count").text() );
  if (currNum < latestNum)
    $(".count").text( currNum + 1 );
}, 50);

我的问题是:如果没有间隔持续运行,有没有更好的方法来做到这一点?这是一个动画递增的东西,我可以从异步请求的响应调用,然后一旦两个数字达到值,它就停止了吗?我还应该注意,下一个请求可能会在两个数字的价值进行协调之前发生。

集体如何做到这一点?

4 个答案:

答案 0 :(得分:2)

更正回答:

评论者:已经意识到自己......还是谢谢你!

var interval = setInterval(function(){
  currNum = Number( $(".count").text() );
  if (currNum < latestNum) {
    $(".count").text( currNum + 1 );
  } else {
    setTimeOut(function() { clearInterval(interval) }, 0);
  }
}, 50);

这会在变量中保存间隔,然后调用clearInterval来停止间隔。需要setTimeOut,否则在执行时间隔将被清除。

第一回答:

为什么不组合这两个功能,即:

setInterval(function(){
  $.post("getcount.php", function(num){
    latestNum = num;
    if (currNum < latestNum) {
        currNum = latestNum;
        $(".count").text( currNum );
    }
  });
}, 5000);

这会阻止每半秒更新一次。

答案 1 :(得分:1)

Obalix回答的基础上,我建议让5秒间隔触发较小的间隔。

var interval = null, currNum = null;
setInterval(function(){
  $.post("getcount.php", function(num){
    latestNum = num;
    if (currNum === null)
        currNum = Number( $(".count").text() ); // should only execute once
    if (currNum < latestNum && interval === null)
        interval = setInterval(ObalixFunction, 50);
  });
}, 5000);

并修改

function ObalixFunction() {
    if (currNum < latestNum) {
        // increment the currNum variable too so we don't have to keep parsing it
        $(".count").text( ++currNum ); 
    } else {
        setTimeOut(function() { clearInterval(interval); interval = null; }, 0);
    }
}

答案 2 :(得分:1)

这是我的答案 - 实际上是两个答案 以固定间隔线性地朝目标值步进的风险永远不会到达那里 所以我也提供了另一种解决方案,每次都会将差异减半,即使对于很大的差异也能更快地达到目标 这两个例子也可以倒数。

$( function() {

    var tRef,
        counter = $( '#counter' );
        target  = $( '#target' );

    /*
     * A function that eases towards its target
     */
    function convergeEasing( target ) {
        clearTimeout( tRef );
        target = parseInt( target );
        var current = parseInt( counter.html() );
        var diff = target - current;
        if( diff ) {
            var rounder = diff > 0 ? Math.ceil : Math.floor;
            current += rounder( diff/2 );
            counter.html( current );
            tRef = setTimeout( function() {
                convergeEasing( target );
            }, 250 );
        }
    }

    /*
     * A function that plods towards its target
     */
    function convergeLinear( target ) {
        clearTimeout( tRef );
        target = parseInt( target );
        var current = parseInt( counter.html() );
        var diff = target - current;
        if( diff ) {
            current += diff > 0 ? 1 : -1;
            counter.html( current );
            tRef = setTimeout( function() {
                convergeLinear( target );
            }, 250 );
        }
    }

    /*
     * I've mocked your ajax request up here for demo purposes
     * using the linear way as per your question
     */
    setInterval( function(){
        var n = Math.round( Math.random()*1000 );
        target.html( n );
        convergeLinear( n );
    }, 5000 );

});

<div id="target">20</div>
<div id="counter">20</div>

我认为缓和策略可以是传入的函数,而不是复制其大部分代码的两个函数

答案 3 :(得分:0)

我会在收到结果时产生第二个间隔,并在达到目标值时终止它。