0

現在、Web ページで使用されている 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();
                    });
                });
            }

しかし、animate メソッドをaddClassに変更するたびに、「Uncaught RangeError: Maximum call stack size exceeded」というメッセージが表示されます。jqueryのaddclassに変更があるようです。どんな助けでも大歓迎です。

4

2 に答える 2

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)});
                });
于 2013-02-16T08:18:35.843 に答える
0

部分を考えてみましょう:

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

私はあなたがglowOpenItems(duration)インライン関数を入れるべきだと思います:

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

また、jQueryセレクターを何度も実行しないでください。選択したjQueryオブジェクトを変数に割り当てて再利用することを検討してください。

于 2013-02-16T08:21:46.033 に答える