【问题标题】:Jquery Airport runs indefinitelyJquery机场无限期运行
【发布时间】:2012-04-17 16:22:41
【问题描述】:

我正在通过以下方式使用 Jquery Airport:

$('#basketTotal').airport([s]);
$('#basketTotal').html(s);

这是机场功能:

(function($){ 
    $.fn.extend({  
        airport: function(array) {
        var self = $(this);
        var chars = ['1','2','3','4','5','6','7','8','9','0','.','£'];
        var longest = 0;
        var items = items2 = array.length;
        function pad(a,b) { return a + new Array(b - a.length + 1).join(' '); }
        $(this).empty();
        while(items--)
            if(array[items].length > longest) longest = array[items].length;
        while(items2--)
            array[items2] = pad(array[items2],longest);
        spans = longest;
        while(spans--) {
            $(this).prepend("<span class='c" + spans + "'></span>");
        }

            function testChar(a,b,c,d){
            $(self).find('.c'+a).html((chars[b]==" ")?"&nbsp;":chars[b]);
            setTimeout(function() {
                if(b > chars.length)
                    testChar(a+1,0,c,d+1);
                else if(chars[b] != array[c].substring(d,d+1).toLowerCase())
                    testChar(a,b+1,c,d);
                else
                    testChar(a+1,0,c,d+1);
            }, 15);


        }
        testChar(0,0,0,0);
    } 

    }); 
})(jQuery);

我只会将一个字符串传递给机场函数(而不是字符串数组)。机场无限期地运行并且不会停止,但我需要让它停止并在它完成后执行$('#basketTotal').html(s);

如何让函数在完成一次动画迭代后停止?

【问题讨论】:

    标签: javascript jquery loops settimeout


    【解决方案1】:

    testChar() 的开头,您可以添加一个测试以查看您是否完成了您想要执行的迭代次数,如果是,则返回。

    如果您从testChar() 返回而不执行setTimeout(),则动画将停止。

    我不太明白你希望它何时停止,所以我不确定要推荐什么测试条件,但它会在这里:

           function testChar(a,b,c,d){
    
               // if (done now) return;
    
               $(self).find('.c'+a).html((chars[b]==" ")?"&nbsp;":chars[b]);
               setTimeout(function() {
                   if(b > chars.length)
                       testChar(a+1,0,c,d+1);
                   else if(chars[b] != array[c].substring(d,d+1).toLowerCase())
                       testChar(a,b+1,c,d);
                   else
                       testChar(a+1,0,c,d+1);
               }, 15);
            }
    

    如果它只是针对特定迭代次数的简单计数器,那么您可以在 testChar(), increment it inside oftestChar()` 之前初始化该计数器并检查是否已完成所需的迭代次数。如果是这样,直接返回而不设置计时器。

    好的,在研究了你的代码之后(这是一种晦涩的算法,没有任何关于它应该如何工作的描述),看起来你可以像这样终止动画:

        function testChar(a,b,c,d){
            // if we're beyond the number of spans we have, we must be done
            if (a > longest) return;
    
            $(self).find('.c'+a).html((chars[b]==" ")?"&nbsp;":chars[b]);
            setTimeout(function() {
                if(b > chars.length)
                    testChar(a+1,0,c,d+1);
                else if(chars[b] != array[c].substring(d,d+1).toLowerCase())
                    testChar(a,b+1,c,d);
                else
                    testChar(a+1,0,c,d+1);
            }, 15);
        }
    

    【讨论】:

    • 您好,感谢您的回答。知道要停止多少次迭代是非常困难的。这是一个 JSFiddle:jsfiddle.net/3rPJ4/1 如果这更有意义,它应该在更新到 9.99 英镑后停止!我只希望它在动画中运行一次,然后停止。
    • 我添加了一种终止循环的方法。如果没有更多描述您的算法的作用,我不知道这是否是您可以终止循环的最早时间,但是当您现在正在寻找比您拥有的更多跨度时,它确实会停止它。
    • 非常感谢,效果很好!我同意这个功能是模糊的,这是我在这里找到的一个小功能:unwrongest.com/projects/airport
    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 2023-01-12
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多