2012-04-17 4 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); 

я только когда-нибудь передать одну строку в аэропорт function (не массив строк). Аэропорт работает бесконечно и не останавливается, но мне нужно остановить его и выполнить $('#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 фунта стерлингов, если это имеет смысл! Я только хочу, чтобы он пробежал анимацию один раз, а затем остановился. –

+0

Я добавил один способ завершить цикл. Без подробного описания того, что делает ваш алгоритм, я не знаю, является ли это самым ранним, вы можете закончить цикл, но он останавливает его, когда вы теперь ищете больше промежутков, чем у вас есть. – jfriend00

+0

Удивительная благодарность, отлично работает! Я согласен, что функция неясна, она небольшая, которую я нашел здесь: http://unwrongest.com/projects/airport/ –

Смежные вопросы