2012-04-17 78 views
0

我使用jQuery機場下列方式:jQuery的機場將無限期運行,

$('#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);

當完成動畫的一次迭代時,如何使函數停止?

回答

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 of testChar()之前初始化那個計數器,並檢查是否已經完成了所需的迭代次數。如果是這樣,只需返回而不設置計時器。

OK,學習你的代碼位(即無它是如何工作的任何說明一個不起眼的算法)後,它看起來像你可以終止這樣的動畫:

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); 
    } 
+0

您好,感謝答案。知道要停止多少次迭代是非常困難的。這裏是一個JSFiddle:http://jsfiddle.net/3rPJ4/1/ 它應該停止後它更新到9.99英鎊,如果這樣做更有意義!我只希望它一次運行動畫,然後停下來。 – 2012-04-17 16:40:27

+0

我添加了一種方法來終止循環。如果沒有更多的關於你的算法的描述,我不知道這是否是最早可以終止循環,但是當你現在正在尋找比你更多的跨度時,它會阻止它。 – jfriend00 2012-04-17 16:59:51

+0

非常感謝,效果很好!我同意這個功能是模糊的,這是我在這裏發現的一個小功能:http://unwrongest.com/projects/airport/ – 2012-04-17 17:24:05