2013-02-16 2 views
0

В настоящее время мы пытаемся обновить jquery, используемый на наших веб-страницах, с 1,8 до 1.10.1, но это нарушило некоторые функции на странице. Я смог изолировать фактический код и был удивлен, увидев это. Рекурсивный код анимации, который выполнялся ранее, вызывал ошибку. Ниже приведен код.Рекурсивная анимация: максимальный размер стека вызовов

<script> 
     $(document).ready(function(){ 
      glowOpenItems(500); 
     }); 
     function glowOpenItems(duration){ 


        $('#dialog').addClass('glowed',duration, function(){ 
         $(this).removeClass('glowed',duration,function(){glowOpenItems(duration)}); 
        }); 

      } 
    </script> 
    <style> 
     .glowed{ 
       box-shadow: 0px 0px 40px 3px #e14f1c; 
       } 
    </style> 
    <div id="dialog" title="Basic dialog"> 
     <p>Test Code</p> 
    </div> 

При дальнейшем исследовании установлено, что эта вещь работает

$(document).ready(function(){ 

      animate(); 
     }); 

     function animate() { 
       $('#dialog').animate({backgroundColor:'#ffcc00'}, 500, function(){ 
        $('#dialog').animate({backgroundColor:'#3b5998'}, 500, function(){ 
          animate(); 
        }); 
       }); 
      } 

Но всякий раз, когда я изменить метод анимированное addClass подвожу «неперехваченным RangeError: Максимальный размер стека вызовов превышены». Похоже, что в addclass jquery есть изменения. Любая помощь будет оценена.

ответ

0

В вашей рекурсии нет base case. так что просто он не выйдет из рекурсии (бесконечная рекурсия.). Вот почему вы получаете максимальную ошибку стека вызовов. Попробуйте добавить базовый регистр, где вы можете выйти из рекурсии.

в вашем состоянии '[id$="reqGlowPanel"]').length>0 && run == true Ни одно из выражений не меняется с выполнением функции. поэтому, если они верны, они все время вернутся к истине.

Попробуйте что-то вроде этого: (Это просто логика так синтаксис может пойти не так.)

function glowOpenItems(duration){ 

       duration-- //decrease your duration in each call 
       if(duration <= 0) 
        return //the base case 
       else 
        $('#dialog').addClass('glowed',duration, function(){ 
        $(this).removeClass('glowed',duration,function() {glowOpenItems(duration)}); 
       }); 
+0

well arpit Этот код использовался для анимации блока непрерывно (бесконечно), и он работал с более ранней версией jquery. – Avidev9

+0

для просто светящейся непрерывной рекурсии вовсе не является хорошим выбором. вместо этого попробуйте использовать петли. В основном проблема заключается в том, что рекурсия не прерывается. Это вызывает ошибку из-за конечного размера stack.Loops выполнит вашу задачу. – Arpit

+0

добавлено больше информации. И добавил образец рабочего рекурсивного аниматора – Avidev9

0

Рассмотрим часть:

$j('[id$="highlightPanelOpenRequiredItems"]').removeClass('glowed',duration,glowOpenItems(duration)); 

Я думаю, вы должны положить glowOpenItems(duration) в встроенной функции :

$j('[id$="highlightPanelOpenRequiredItems"]').removeClass('glowed',duration,function(){glowOpenItems(duration);}); 

Кроме того, вы не должны выполнять селектор jQuery слишком много раз. Рассмотрите возможность назначения выбранных объектов jQuery переменной и повторного использования.

+0

попробовал не работает – Avidev9

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